rozšiřitelnost asp.net mvc
DESCRIPTION
Technologie ASP.NET MVC je rozšiřitelnější než se na první pohled může zdát! Pokročilejší přednáška pro ty, kteří už ASP.NET MVC někdy viděli, ukazuje, jak jednoduše upravit vestavěné routování, volání akčních metod, vyhledávání views, model binding, filtry... Na praktických příkladech bude ukázáno, jak využitím této rozšiřitelnosti dosáhnout elegantnějšího a čistšího kódu. Dema a videozáznam: http://wug.cz/praha/akce/595-Rozsiritelnost-ASP-NET-MVCTRANSCRIPT
![Page 1: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/1.jpg)
RozšiřitelnostASP.NET MVCTomáš Pastorek, @topasCZ
www.avast.com
![Page 2: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/2.jpg)
ASP.NET MVC
Controller
Model View
Business vrstva
ViewModels
![Page 3: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/3.jpg)
Lifecycle ASP.NET MVC
1. URL request (GET, POST, …)
2. Routování (System.Web.Routing):
1. RouteTable (RouteCollection)
• Seznam routovacích pravidel (třída Route)
2. MvcRouteHandler : IRouteHandler
• Metoda pro získání IHttpHandleru
3. MvcHandler : IHttpHandler
• Pomocí IControllerFactory vytvoří instancicontroller a spustí…
ASP.N
ET MV
C
![Page 4: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/4.jpg)
Lifecycle ASP.NET MVC
3. Controller.Execute(RouteContext ctx)
– Zpracování akční metody (IActionInvoker)1. Výběr akční metody
2. Spouštění filtrů
3. ModelBinding
4. Vrácení výsledku *)
*) ViewResult používá kolekci IViewEnginepro render stránky
![Page 5: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/5.jpg)
Routování
Namespace System.Web.Routing• Route – Oboustranný převod mezi URL a datovými
strukturami routování.• IRouteConstraint – Omezení nad routovacím
pravidlem (vrací 404 v případě chyby)• IRouteHandler – Vlastní handler pro obsluhu
požadavku.
Projekt RouteMagic (Phil Haack)https://github.com/haacked/routemagic
RouteDebugger (NuGet)
![Page 6: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/6.jpg)
Demo
![Page 7: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/7.jpg)
Vytváření cotrollerů
• Implementovat IControllerFactory• Lépe zdědit z DefaultControllerFactory
– přepsat metody GetControllerInstance a ReleaseController
• Nastavit factory: ControllerBuilder.Current.SetControllerFactory(…)
• IDependencyResolver– adapter mezi DI kontejnery a ASP.NET MVC– DependencyResolver.SetResolver(…)– Nutno registrovat i ostatní závislosti pro ASP.NET MVC– Hotové balíčky pro (téměř) každý DI kontejner
![Page 8: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/8.jpg)
Demo
![Page 9: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/9.jpg)
ActionFilters
• Attribute implementující jeden z těchtointerface:
– IAuthorizationFilter (AuthorizeAttribute,
ValidateAntiForgeryTokenAttribute)
– IExceptionFilter (HandleErrorAttribute,
OutputCacheAttribute)
– IResultFilter (OutputCacheAttribute)
– IActionFilter (OutputCacheAttribute)
![Page 10: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/10.jpg)
Použití ActionFilters
• Zdědit z FilterAttribute
– Aplikace na celý controller nebo akční metodě
• Přidat do kolekce GlobalFilters.Filters
• Implementace IFilterProvider
– Metoda GetFilters(…) vrací filtery, které mají býtpoužity
– Přidat do kolekce FilterProviders.Providers
![Page 11: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/11.jpg)
Demo
![Page 12: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/12.jpg)
Výběr akční metody
• HttpGetAttribute, HttpPostAttribute(HttpPut, HttpDelete, …)
• ActionMethodSelectorAttribute– bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
![Page 13: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/13.jpg)
Demo
![Page 14: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/14.jpg)
ModelBinders
• Převod dat z requestu (POST, GET, …) do akční metody
• DefaultModelBinder
– mapování jednoduchých i složených modelů
• Implementuje IModelBinder• object BindModel(ControllerContext
controllerContext, ModelBindingContextbindingContext)
![Page 15: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/15.jpg)
Použití ModelBinders
• Přidání do kolekce ModelBinders.Binders
– Dvojice Type, IModelBinder
• Implementace IModelBinderProvider
– IModelBinder GetBinder(Type modelType)
– Přidat do kolekceModelBinderProviders.BinderProviders
![Page 16: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/16.jpg)
Demo
![Page 17: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/17.jpg)
ActionResults
• ViewResult, RedictResult, RedirectToRouteResult…
Přidáno v ASP.NET MVC 3:• HttpNotFoundResult, HttpStatusCodeResult, HttpUnauthorizedResult
Usnadnění vracení hodnot z akčních metod• JsonResult, ContentResult, FileContentResult, FileStreamResult
• Vlastní implementaci zdědit z ActionResult– Přepsat metodu ExecuteResult(ControllerContext context)
![Page 18: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/18.jpg)
Demo
![Page 19: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/19.jpg)
ViewEngine
• Vestavěný RazorViewEngine a WebFormsViewEngine
• Zodpovědný za vytvoření instance IView• Seznamy cest pro vyhledávání souborů View:
– ViewLocationFormats ("~/Views/{1}/{0}.cshtml")– PartialViewLocationFormats
("~/Views/{1}/{0}.cshtml")– MasterLocationFormats
("~/Views/Shared/{0}.cshtml")
• Kolekce enginů, které se používájí: ViewEngines.Engines
![Page 20: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/20.jpg)
Demo
![Page 21: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/21.jpg)
DisplayModeProvider
• Používá vestavěnýVirtualPathProviderViewEngine
• Mobilní web snadno a rychle: Index.Mobile.cshtml
• DisplayModeProvider.Instance.Modes– Kolekce pravidel – použije se první nalezené pravidlo
• Pravidla zděděné z IDisplayMode
• Jednoduchá implementacepomocí DefaultDisplayMode– Název módu
– Lambda pro určení, kdy se má mód použít
![Page 22: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/22.jpg)
Browser overriding
• Extenzní metody pro HttpContextBase
– SetOverridenBrowser(BrowserOverriderbrowser)
– ClearOverridenBrowser()
– A další…
• Namespace System.Web.WebPages
• Přepisují nastavení UserAgent
• Ukládají do cookie “.ASPXBrowserOverride”
![Page 23: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/23.jpg)
Demo
![Page 24: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/24.jpg)
Extenzní metody
• HtmlHelper– Generování HTML kódu– Vrací MvcHtmlString : IHtmlString
• UrlHelper– Pomocné metody pro práci s URL a routováním
• Pro helpery z vlastních namespaces je nutné– @using– Web.config v adresáři View:
< system.web.webPages.razor><pages><namespaces>
![Page 25: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/25.jpg)
Tvorba helperů
• Třída TagBuilder• Statické metody HtmlHelper
– AnonymousObjectToHtmlAttributes
• Namespace System.Web.Mvc.Html:– Extenzní metody pro HtmlHelper:
• Id, IdFor, Name, NameFor
• Razor kód jako parametr metody(Razor delegate):Func<object, HelperResult>
• ModelMetadata – práce s anotacemi a metadaty modelu
![Page 26: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/26.jpg)
Tvorba helperů
• Blokové (kontejnerové) helpery:Idisposable + disposable pattern
• Konvence Begin*, End*
• Metoda Begin* je extenzní metodaHtmlHelperu
• Html kód se vkládápomocí ViewContext.Writer
![Page 27: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/27.jpg)
Tvorba “fluent” helperů
• Třída “TestHelper” dědí z IHtmlString– Html kód vrací metoda ToHtmlString()
• Settery:public TestHelper Text(string text){
Text = text; return this;
}
• Extenzní metoda pro HtmlHelper, která vrátíTestHelper
![Page 28: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/28.jpg)
Vlastní ViewPageBase
• Zdědit z WebViewPage<T> (Razor)
• Snáze přístupné vlastní helpery nebo metodyve View
• Silně typové zabalení ViewBag/ViewData
• Web.config: <system.web.webPages.razor><pagespageBaseType=“…”>
![Page 29: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/29.jpg)
Demo
![Page 30: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/30.jpg)
Editor/display templates
• Html.EditorFor(…)
• Html.DisplayFor(…)
• DRY koncept
• Vestavěné DisplayTemplates: Boolean, Decimal, EmailAddress, HiddenInput, Html, Object, string, Url
• EditorTemplates: Boolean, Decimal, HiddenInput, MultilineText, Object, Password, String
![Page 31: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/31.jpg)
Editor/display templates
• Priority cest:
1. Area…Views/Controller/DisplayTemplates/Template.cshtml
2. Area…Shared/DisplayTemplates/Template.cshtml
3. Views/Controller/DisplayTemplates/Template.cshtml
4. Views/Shared/DisplayTemplates/Template.cshtml
![Page 32: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/32.jpg)
Editor/display templates
• Priorita názvů souborů šablon:– ModelMetadata.TemplateHint
– ModelMetadata.DataTypeName
– Název typu: (Type.Name)• Šablona musí být přípravena i pro nullable typy, ModelMetadata.IsNullableValueType
– Názvy jednoduchých typů: např. “String”
– Složené typy: “Object” (hledání v dědičnosti)
![Page 33: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/33.jpg)
Demo
![Page 34: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/34.jpg)
Javascriptová validace
• Unobtrusive volání
• jQuery validate + wrapper (jquery.validate.unobtrusive.js)
• Validační atribut s klientskou validací:1. Pro poděděné atributy z výchozích anotací:
DataAnnotationsModelValidatorProvider
2. ValidationAttribute, IClientValidatable
+ implementace GetClientValidationRules a validačních pravidel v JS a wrapperu
![Page 35: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/35.jpg)
Demo
![Page 36: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/36.jpg)
Razor 2 - URL
<scriptsrc=”@Url.Content(“~/Scripts/script.js”)”></script>
<script src=”~/Scripts/script.js”></script>
<img src=”@Url.Content(“~/Site/Images”)@Year/May/@Day” />
<img src=”~/Site/Images/@Year/May/@Day” />
![Page 37: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/37.jpg)
Razor 2 - Atributy
@{string trida = null;}
<div class=”@trida”>…
<div class=””>… <div>…
@{ string a = null; string b = “bar” }
<div class=”@a @b”>
<div class=” b”>… <div class=“b”>…
Boolean attributy: checked, readonly
![Page 38: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/38.jpg)
Alternativní frameworky
• NancyFx (inspirace Sinatrou)
– Jednoduchý a lehký framework pro tvorbubackend
– Hosting: ASP .NET, OWIN, Self, WCF
– Pro ASP .NET jako HttpHandler
• Nina, Manos
• FubuMVC
• OpenRasta
![Page 39: Rozšiřitelnost ASP.NET MVC](https://reader035.vdocument.in/reader035/viewer/2022062319/558bc423d8b42ac24b8b46a1/html5/thumbnails/39.jpg)
Tipy na závěr
• Nebojte se dělat helpery – DRY• Editor/Display templates (pouze pro opakující se případy) • Moc chování ASP.NET MVC neupravovat, protože s tím
mohou počítat některé balíčky
• Mohu doporučit:– NuGet– T4MVC– TwitterBootstrapMvc– FluentValidation