21
Rozšiřitelnost ASP.NET MVC Tomáš Pastorek, @topasCZ www.avast.com

Rozšiřitelnost ASP.NET MVC

  • Upload
    topascz

  • View
    630

  • Download
    4

Embed Size (px)

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.

Citation preview

Page 1: Rozšiřitelnost ASP.NET MVC

RozšiřitelnostASP.NET MVCTomáš Pastorek, @topasCZ

www.avast.com

Page 2: Rozšiřitelnost ASP.NET MVC

ASP.NET MVC

Controller

Model View

Page 3: Rozšiřitelnost ASP.NET MVC

Zjednodušený lifecycle

1. URL (data GET, POST, …)

2. Routing: RouteTable -> UrlRoutingModule -> MvcHandler

3. Controller.Execute(RouteContext ctx)– Zpracování akční metody (IActionInvoker)

• Výběr akční metody

• Spouštění filtrů

• ModelBinding

• Vrácení výsledku *)

*) ViewResult používá kolekci IViewEnginepro render stránky

Page 4: Rozšiřitelnost ASP.NET MVC

Routování

Namespace System.Web.Routing• Route – Oboustraný převod mezi URL a datovými

strukturami routování.• IRouteConstraint – Omezení nad routovacím

pravidlem.• IRouteHandler – Vlastní handler pro obsluhu

požadavku.

Projekt RouteMagic (Phil Haack)https://github.com/haacked/routemagic

Page 5: Rozšiřitelnost ASP.NET MVC

Demo

Page 6: Rozšiřitelnost ASP.NET MVC

Vytváření cotrollerů

• Implementovat IControllerFactory• Lépe zdědit z DefaultControllerFactory

– přepsat metodu GetControllerInstance

• 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 7: Rozšiřitelnost ASP.NET MVC

ActionFilters

• Attribute impelemtující jeden z těchtointerface:

– IAuthorizationFilter (AuthorizeAttribute,

ValidateAntiForgeryTokenAttribute)

– IExceptionFilter (HandleErrorAttribute,

OutputCacheAttribute)

– IResultFilter (OutputCacheAttribute)

– IActionFilter (OutputCacheAttribute)

Page 8: Rozšiřitelnost ASP.NET MVC
Page 9: Rozšiřitelnost ASP.NET MVC

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 10: Rozšiřitelnost ASP.NET MVC

Demo

Page 11: Rozšiřitelnost ASP.NET MVC

Výběr akční metody

• HttpGetAttribute, HttpPostAttribute(HttpPut, HttpDelete, …)

• ActionMethodSelectorAttribute– bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)

Page 12: Rozšiřitelnost ASP.NET MVC

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 13: Rozšiřitelnost ASP.NET MVC

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 14: Rozšiřitelnost ASP.NET MVC

Demo

Page 15: Rozšiřitelnost ASP.NET MVC

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 16: Rozšiřitelnost ASP.NET MVC

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 17: Rozšiřitelnost ASP.NET MVC

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 18: Rozšiřitelnost ASP.NET MVC

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 19: Rozšiřitelnost ASP.NET MVC

Demo

Page 20: Rozšiřitelnost ASP.NET MVC

Extenzní metody

• HtmlHelper– Generování HTML kódu– Vrací MvcHtmlString

• 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 21: Rozšiřitelnost ASP.NET MVC

Děkuji za pozornost

www.aspnetmvc.cz

@aspmvc

[email protected], @topasCZ