Transcript
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