ASP.NET MVC Extensibility

Post on 02-Dec-2014

5.630 views 1 download

description

One of the best features of ASP.NET MVC is that it's totally extensible: if you don't like the way the framework works or if you have scenarios not covered by it, you can change the behaviors by extending the defaults or by writing your owns. In this presentation I'll go through all the main extensibility points and explain how to leverage the main ones

Transcript of ASP.NET MVC Extensibility

Extending ASP.NET MVCPart 1

Simone ChiarettaArchitect, Council of the EUhttp://codeclimber.net.nzTwitter: @simonech

June 23rd, 2010

Who the hell am I?

► Simone Chiaretta► Microsoft MVP ASP.NET► ASP Insider► Blogger – http://codeclimber.net.nz ► Italian ALT.NET UG Founder► OpenSource developer► Climber► All Around Nice Guy

Disclaimer:"The views expressed are purely those of the speaker and may not in any circumstances be regarded as stating an official position of the Council"

Agenda

► The default ASP.NET MVC Pipeline► Extensibility points’ list► The Most important extensibility points

The Default ASP.NET MVC Pipeline

The default ASP.NET MVC Pipeline

Request

URLRouting

Route RouteHandler

HttpHandler

Controller Factory Controller

Action

ViewFactory View

Response

5

The default components

► URL Routing:– Parses the URL, and instantiate the MvcHandler

► Controller Factory– Takes URL parameters, create controller via reflection based on Controller name

► Action Invoker– Invokes the action based on the name, with the filters before and after

► View Engine– WebForms view engine

► Template– Renders a TextBox almost for everything

► HtmlHelper– Has a bunch of standard methods

ASP.NET MVC IS extensible

► If you don’t like them► If you need something else► Change them

ASP.NET MVC IS extensible

► Almost every aspect of the framework can be extented/replaced

Extensibility points’ list

Routing extensibility

► RouteConstraint– Validates route parameters with code

► RouteHandler– Defines how the request must be handled

Controller Extensibility

► ControllerFactory– Responsible for creating Controllers

► ActionInvoker– Invokes an action, based only on its name

► ActionMethodSelector Attribute– Helps the action invoker decide which action to invoke when the name is not unique

► Controller– The base class for every controller

► ActionResult– Decides how to send the output to the user

Action Filter Extensibility

► AuthorizationFilter– Makes sure the current request is allowed

► Action Filters– Executed before or after the action executes

► Result Filters– Executed before or after an action result executes

Binding/Validation Extensibility

► ModelBinder– Populates the action method parameters from the request

► ModelValidator Provider– Retrieves the validation rules

► Server-side Validation Rules– The actual server-side validation rule

View Extensibility

► ViewEngine– The service that transforms in HTML the data for the user

► HtmlHelpers– Utility functions that hide away the generation of some HTML markup or JavaScript code

► Client-side Validation Rules– Client-side validation rules

► ModelMetadata Provider– Retrieves the metadata needed for the templated helpers

► Custom Templates– Renders the html to edit/display specific types

The Most important extensibility points

The Most important Extensibilit points► The ones you will definitely use► The ones you have to start using► The ones you might or might not need to use

► The ones you most likely will not write yourself– but probably use written by others

Extensibility points you will use

Custom Templates

Custom Templates

► WHAT: Renders the html to edit/display specific types

► DEFAULT: Everything is a label or a textbox

► WHY: Add your own to customize specific data-types

Custom Templates

► Add PartialViews in:– /Views/Shared/DisplayTemplates– /Views/Shared/EditorTemplates

Demo

Server-side Validation Rules

Server-side Validation Rules

► WHAT: Define how a property is validated in the server side validation

► DEFAULT: Required, Length, wrong type► WHY: Add your own rules

Server-side Validation Rules

► Write a new ValidationAttribute► Implement the IsValid method► Apply attribute to your model

Demo

Client-side Validation Rules

Client-side Validation Rules

► WHAT: Define how a property is validated in the client-side validation

► DEFAULT: Client-side counterparts of the default server-side validators

► WHY: Add your own validators

Client-side Validation Rules

► First make a server-side validator► Make validation logic in JavaScript► Write adapter to push validation rules to client-side

► Register validation function via JS► Register adapter in Global.asax

Demo

Extensibility points you have to start using

Base Controller

Base Controller

► WHAT: The base class for every Controller► DEFAULT: Default implementation of helper methods

► WHY: Extend if you want to enforce you own conventions

Base Controller

► Override Controller► Your controllers override from BaseController instead of Controller

Demo

HtmlHelpers

HtmlHelpers

► WHAT: Utility functions that hide away the generation of HTML markup or JavaScript code

► DEFAULT: Html.TextBox, Html.Encode, Html.Partial, …

► WHY: “If there is an if, write an Helper”

HtmlHelpers

► Add new methods as extension methods

Demo

Rating

If you liked this talk, please consider rating it:

http://speakerrate.com/talks/3669-asp-net-mvc-extensibility

34 Disclaimer:"The views expressed are purely those of the speaker and may not in any circumstances be regarded as stating an official position of the Council"

Extending ASP.NET MVCPart 2

Simone ChiarettaArchitect, Council of the EUhttp://codeclimber.net.nzTwitter: @simonech

June 23rd, 2010

Filters

Authorization Filter

► WHAT: Makes sure the current request is allowed

► DEFAULT: It is based on the ASP.NET Membership provider

► WHY: Change if you want not to use ASP.NET MVC or if you want to enhance the route dictionary

Action Filters

► WHAT: Executed before or after the action executes

► DEFAULT: Output cache► WHY: Add your own based on your needs

Result Filters

► WHAT: Executed before or after an action result executes

► DEFAULT: No default result filters► WHY: Add your own based on your needs

Authorization Filter

► Implement IAuthorizationFilter– OnAuthorization

Filters

► Implement IActionFilter + IResultFilter► Make new ActionFilterAttribute

– OnActionExecuting– OnActionExecuted

► Implement IResultFilter– OnResultExecuting– OnResultExecuted

Extensibility points you might want to use

RouteConstraint

RouteConstraint

► WHAT: Validates route parameters► DEFAULT: No default implementation► WHY: Add your own when needed

RouteConstraint

► Implement– IRouteConstraint.Match

► Inspect request and return true or false

Demo

RouteHandler

RouteHandler

► WHAT: Defines how the request must be handled

► DEFAULT: Routes the request to MvcHandler► WHY: Change if you want not to use ASP.NET MVC

RouteHandler

► Implement– IRouteHandler.GetHttpHandler

Demo

ActionMethodSelector Attribute

ActionMethodSelector Attribute

► WHAT: Helps the action invoker decide which action to invoke when the name is not unique

► DEFAULT: HttpMethod attributes: decide based on the HttpMethod

► WHY: Add your own to support different scenarios

ActionMethodSelector Attribute

► Create new Attibute inheriting from– ActionMethodSelectorAttribute

► Implement:– IsValidForRequest

Demo

ActionResult

ActionResult

► WHAT: Sends the output to the user► DEFAULT: ViewResult, RedirectResult, FileResult, JsonResult, etc…

► WHY: Add your own if you need an output not available in the default results

ActionResult

► Create a new result inheriting from:– ActionResult

► Implement:– ExecuteResult

► Optionally create an helper method in you “base controller”

Demo

ModelBinder

ModelBinder

► WHAT: Populates the action method parameters from the request

► DEFAULT: Binds request’s values based on names

► WHY: Extend if you need to add other way of binding

ModelBinder

► Implement IModelBinder– BindModel

► Inherit from DefaultModelBinder– BindProperty– OnModelUpdated– OnModelUpdating

► Register the ModelBinder

Demo

Very unlikely to write your own

ControllerFactory

Controller Factory

► WHAT: Responsible for creating Controllers► DEFAULT: Create an instance of the Controller via Reflection based on its name

► WHY: Change if you want to create the controller in other ways or if you want to add some funtionalities

► Most of the main IoC container have a custom ControllerFactory

Controller Factory

► Implement IControllerFactory– CreateController– ReleaseController

► Override DefaultControllerFactory– GetControllerInstance(Type controllerType)

Demo

ActionInvoker

ActionInvoker

► WHAT: Invokes an action, based only on its name

► DEFAULT: Call the action method, via reflection, based on its name, gathering filters via attributes and calling them before and after

► WHY: Change if you want to change the way methods are called, or want different way to configure Filters

ActionInvoker

► Implement IActionInvoker– InvokeAction

► Override ControllerActionInvoker– InvokeActionMethodWithFilters– InvokeActionResultWithFilters– GetFilters– …

Demo

ViewEngine

View Engine

► WHAT: The service that transforms in HTML the data for the user

► DEFAULT: WebForm view engine► WHY: Change if you don’t like the WebForm approach

View Engine

► IViewEngine:– Usually override VirtualPathProviderViewEngine– CreateView

► IView:– Render

Demo

ModelValidator Provider

ModelValidator Provider

► WHAT: Retrieves the validation rules► DEFAULT: Validation rules are defined with DataAnnotation attributes

► WHY: Change if you want to specify validation rules in other ways (XML, Database, etc…)

ModelValidator Provider

► Override from ModelValidatorProvider► Implement GetValidators

ModelMetadata Provider

ModelMetadata Provider

► WHAT: Retrieves the metadata needed for the templated helpers

► DEFAULT: Metadata are defined with DataAnnotation attributes

► WHY: Change if you want to specify metadata in other ways (XML, Database, etc…)

ModelMetadata Provider

► Inherit from ModelMetadataProvider► Implement

– GetMetadataForType– GetMetadataForProperty– GetMetadataForProperties

Contacts – Simone Chiaretta

► MSN: simone_ch@hotmail.com► Blog:

– English: http://codeclimber.net.nz/– Italian: http://blogs.ugidotnet.org/piyo/

► Twitter: @simonech

74

Rating

If you liked this talk, please consider rating it:

http://speakerrate.com/talks/3669-asp-net-mvc-extensibility

75 Disclaimer:"The views expressed are purely those of the speaker and may not in any circumstances be regarded as stating an official position of the Council"