ASP.NET Dynamic Data Jakub Binkowski Jakub Binkowski Visual C# MVP Webstruments.pl / webEFS
Cel prezentacji Pokazać: co to jest Dynamic Data, jak zacząć pracę z DD, jak dostosować DD do własnych potrzeb, jak rozszerzać DD, architekturę DD, miejsce DD w poważnej inżynierii oprogramowania.
Podstawowe zastosowania Czym jest ASP.NET Dynamic Data? Pierwsza dynamiczna aplikacja.
Scaffolding ASP.NET Dynamic Data tworzy rusztowanie (ang. scaffolding) dla aplikacji.
DEMO Pierwsza aplikacja
ASP.NET Dynamic Data Generuje UI w ASP.NET na podstawie źródła danych Wsparcie dla operacji CRUD Pełne wsparcie dla technologii: LINQ to SQL Entity Framework Interfejs generowany jest dynamicznie Automatyczna walidacja na podstawie danych o polach
Możliwości dostosowywania Zmiana zachowania: Ograniczanie widoczności do tabel i kolumn Rozszerzanie metadanych kolumn Zmiana UI (strony i kontrolki): Modyfikacja szablonów Specyficzne szablony dla różnych tabel Specyficzne szablony w zależności od konfiguracji Własne strony
Dostosowywanie DD: Zmiana zachowania Rozszerzanie metadanych
Jak dodawać metadane do modelu? [Atrybuty] dopisywane do klas i pól encji Ale encje L2S i EF są generowane… Encje L2S i EF są partial - rozszerzalność Atrybut [MetadataType] – podpięcie zewnętrznej klasy z metadanymi
Ograniczanie dostępności [ScaffoldTable] Generowanie UI dla tabel: widoczne wszystkie, oprócz wybranych widoczne tylko wybrane [ScaffoldColumn] Można wskazać, dla których pól będzie generowany UI [Editable] Ograniczenie edytowalności niektórych pól ang. scaffolding - rusztowanie
DEMO Ograniczenie widoczności
[Display] [Display(ShortName="Nazwa", Order=1, Name="Nazwa produktu", Description="Jak się produkt nazywa?", GroupName="Opis produktu", Prompt="Podaj nazwę...", AutoGenerateField=true, AutoGenerateFilter=false)] public string Name;
DisplayFormat [DisplayFormat( DataFormatString="{0:C}", ApplyFormatInEditMode=false, ConvertEmptyStringToNull=true, HtmlEncode=true, NullDisplayText="wycofano ze sprzedaży")] public decimal StandardCost;
[DisplayColumn] Wyświetlana kolumna Kolumna, po której następuje sortowanie [DisplayColumn("Name", "ProductNumber")] partial class Product { }
[DataType] Custom DateTime Date Time Duration PhoneNumber Currency [DataType(DataType.MultilineText)] public string Comments; Custom DateTime Date Time Duration PhoneNumber Currency Text Html MultilineText EmailAddress Password Url ImageUrl
[EnumDataType] public class Review { [EnumDataType(typeof(Rating))] public int Rating; } public enum Rating Good = 5, Fine = 4, Average = 3, Bad = 2, Terrible = 1
DEMO Wizualizacja danych
Walidacja Atrybuty walidacyjne: [CustomValidation] [Range] [RegularExpression] [Required] [StringLength] [EnumDataType] własny atrybut
DEMO Walidacja
Walidacja spoza DD Walidację można odpalić niezależnie od DD Klasa Validator: (System.ComponentModel.DataAnnotations) ValidateObject / TryValidateObject ValidateProperty / TryValidateProperty ValidateValue / TryValidateValue
Dostosowywanie DD: Zmiana wyglądu
Struktura aplikacji FieldTemplates szablony prezentacji i edycji właściwości EntityTemplates szablony Show/Edit/Insert dla encji PageTemplates szablony stron Filters filtry do przeszukiwania
FieldTemplates Kontrolki prezentacji/edycji pola UI dla poszczególnych kolumn W folderze FieldTemplates: Nazwa.ascx - prezenter Nazwa_Edit.ascx - edytor Użycie szablonu: [UIHint("Rating")] public int Rating;
DEMO FieldTemplates
EntityTemplates Kontrolki dla encji UI dla poszczególnych tabel W folderze EntityTemplates: Tabela.ascx - prezentacja Tabela_Edit.ascx - edycja Tabela_Insert.ascx - dodawanie Tabela – nazwa EntitySet’u a nie klasy (!) np. „ProductReviews”
PageTemplates i CustomPages Szablony widoków UI dla poszczególnych widoków Domyślne szablony w PageTemplates: Widok.aspx (List, Details, Insert, Edit, …) Szczegółowe szablony dla tabel w: CustomPages/Tabela/*.aspx gdzie Tabela – nazwa EntitySet’u
DEMO EntityTemplates i CustomPages
Filters Własne filtry UI dla przeszukiwania listy – filtrów Folder Filters: Nazwa.ascx Użycie filtru: [Display(AutoGenerateFilter=true)] [FilterUIHint("Text")] public string Name;
DEMO Filters
Architektura Dynamic Data Czyli jak to działa?
Jak to możliwe? http://server/Products/List.aspx
1) Baza, model, metamodel Baza danych Model danych Metamodel DataModelProvider
2) Routing routes.Add(new DynamicDataRoute("{table}/{action}.aspx") { Constraints = new RouteValueDictionary( new { action = "List|Details|Edit|Insert" }), Model = DefaultModel });
Zadania Dynamic Data Przechowywanie metadanych Określenie tabeli i akcji (parametry z routingu) Załadowanie odpowiedniej strony Dynamic Data nie odpowiada za operacje na danych (pobieranie, modyfikacje, itp.)... A jeśli nie DD, to kto?
DEMO Działanie Dynamic Data
Podsumowanie
Zalety Gotowa aplikacja w mniej niż minutę Automatyczna aktualizacji UI po zmianach Szerokie możliwości dostosowywania Ciekawa architektura
Wady Testowalność Spłaszczenie architektury aplikacji Pełne wsparcie tylko dla: LINQ to SQL Entity Framework
Czy w idealnej architekturze jest miejsce na Dynamic Data? Nie. Ale czy ktoś widział kiedyś idealną architekturę?
Zastosowania Prototypowanie Szybkie udostępnienie wersji 0.1 Panel administracyjny
Cel prezentacji Czy udało mi się pokazać: co to jest Dynamic Data, jak zacząć pracę z DD, jak dostosować DD do własnych potrzeb, jak rozszerzać DD, architekturę DD, miejsce DD w poważnej inżynierii oprogramowania?
Czy mamy jeszcze czas?
Dziękuję za uwagę