asp.net mvc extensibility
Post on 02-Dec-2014
5.636 Views
Preview:
DESCRIPTION
TRANSCRIPT
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"
top related