ASP.
NET MVC Essentials
Routi ng, Controllers, Acti ons,
Views, Areas…
SoftUni Team
Technical Trainers
Software University
http://softuni.bg
Table of Contents
1. ASP.NET MVC Routing
Route constraints
2. Controllers and Actions
Action results and filters
3. Razor Views
Layout and sections
Helpers
Partial views
4. Areas 2
ASP.NET MVC Routing
ASP.NET MVC Routing
Mapping between patterns and a combination of
controller + action + parameters
Routes are defined as a global list of routes
System.Web.Routing.RouteTable.Routes
Something similar to Apache mod_rewrite
Greedy algorithm
the first match wins
4
Register routes
In Global.asax in the Application_Start() there is:
RouteConfig.RegisterRoutes(RouteTable.Routes);
RoutesConfig class is located in /App_Start/ in internet
applications template by default
Routes to ignore
The [*] means all left
Route name
Route pattern
Default parameters
5
Routing Examples
http://localhost/Products/ById/3
Controller: Products
Action: ById
Id: 3 6
Routing Examples (2)
http://localhost/Products/ById
Controller: Products
Action: ById
Id: 0 (optional parameter) 7
Routing Examples (3)
http://localhost/Products
Controller: Products
Action: Index
Id: 0 (optional parameter) 8
Routing Examples (4)
http://localhost/
Controller: Home
Action: Index
Id: 0 (optional parameter) 9
Custom Route
http://localhost/Users/VGeorgiev
Controller: Users
Action: ByUsername
Username: VGeorgiev 10
Custom Route (2)
http://localhost/Users
Controller: Users
Action: ByUsername
Username: DefaultValue 11
Custom Route (3)
?
http://localhost/Users
Result: 404 Not Found
12
Route Constraints
Constraints are rules on the URL segments
All the constraints are regular expression compatible with class
Regex
Defined as one of the routes.MapRoute(…) parameters
13
Custom Route Constraint
public class LocalhostConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
return httpContext.Request.IsLocal;
}
}
routes.MapRoute("Admin",
"Admin/{action}",
new { controller="Admin" },
new { isLocal = new LocalhostConstraint() }
);
14
Debugging Routes
In actions we have access to a data structure called RouteData
RouteData.Values["controller"]
RouteData.Values["action"]
RouteData.Values["id"]
We can use NuGet package: RouteDebugger
Install-Package RouteDebugger
Web.config:
<add key="RouteDebugger:Enabled" value="true" />
We can also use Glimpse for debugging routes 15
Demo: Routes
ASP.NET MVC Routing
Controllers and Actions
The brain of the applicati on
Controllers
The core component of the MVC pattern
All the controllers should be available in a folder by name
Controllers
Controller naming standard should be "NameController"
Routers instantiate controllers in every request
All requests are mapped to a specific action
Every controller should inherit Controller class
Access to Request (context) and HttpContext
18
Actions
Actions are the ultimate request destination
Public controller methods
Non-static
No return value restrictions
Actions typically return an ActionResult
19
ASP.NET MVC Request
20
Action Results
Controller action response to a browser request
Inherits from the base ActionResult class
Different results types:
Name Framework Behavior Producing Method
ContentResult Returns a string literal Content
EmptyResult No response
FileContentResult Return the contents of a file File
FilePathResult
FileStreamResult
21
Action Results (2)
Name Framework Behavior Producing Method
HttpUnauthorizedResult Returns an HTTP 403 status
JavaScriptResult Returns a script to execute JavaScript
JsonResult Returns data in JSON format Json
RedirectResult Redirects the client to a new URL Redirect /
RedirectPermanent
RedirectToRouteResult Redirect to another action, or another RedirectToRoute /
controller’s action RedirectToAction
ViewResult Response is the responsibility of a View / PartialView
PartialViewResult view engine
22
Action Parameters
ASP.NET MVC maps the data from the HTTP request to action
parameters in few ways:
Routing engine can pass parameters to actions
http://localhost/Users/VGeorgiev
Routing pattern: Users/{username}
URL query string can contains parameters
/Users/ByUsername?username=VGeorgiev
HTTP post data can also contain parameters
23
Action Selectors
ActionName(string name)
AcceptVerbs
HttpPost
HttpGet
HttpDelete
HttpOptions
…
NonAction
RequireHttps
ChildActionOnly – Only for Html.Action() 24
Action Filters
Apply pre- and post-processing logic
Similar to HTTP Modules
Can be applied to actions and to controllers
Global filters can be registered in GlobalFilters.
Filters (or in /App_Start/FilterConfig.cs)
Name Description
OutputCache Cache the output of a controller
ValidateInput(false) Turn off request validation and allow dangerous input (html tags)
Authorize Restrict an action to authorized users or roles
ValidateAntiForgeryToken Helps prevent cross site request forgeries
HandleError Can specify a view to render in the event of an unhandled exception
25
Custom Action Filter
Create C# class file in /Filters/
Inherit ActionFilterAttribute
We can override:
OnActionExecuting (ActionExecutingContext)
OnActionExecuted (ActionExecutedContext)
OnResultExecuting (ResultExecutingContext)
OnResultExecuted (ResultExecutedContext)
We can apply our new attribute to a controller, method or globally in
GlobalFilters.Filters 26
Custom Action Filter (2)
public class LogAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{ … }
public override void OnActionExecuted(ActionExecutedContext filterContext)
{ … }
public override void OnResultExecuting(ResultExecutingContext filterContext)
{ … }
public override void OnResultExecuted(ResultExecutedContext filterContext)
{ … }
}
[Log]
public class DepartmentController : Controller
{ … }
27
Razor Views
Views
HTML templates of the application
A lot of view engines available
View engines execute code and provide HTML
Provide a lot of helpers to easily generate HTML
The most popular is Razor and WebForms
We can pass data to views through:
ViewBag, ViewData and Model (strongly-typed views)
Views support master pages (layout views)
Other views can be rendered (partial views) 29
Razor
Template markup syntax
Simple-syntax view engine
Based on the C# programming language
Enables the programmer to use an HTML construction workflow
Code-focused templating approach, with minimal transition
between HTML and code
Razor syntax starts code blocks with a @ character and does not
require explicit closing of the code-block
30
Design Goals
Compact, Expressive, and Fluid
Smart enough to differ HTML from code Template
Easy to Learn
Is not a new language
+
Works with any Text Editor Data
Has great Intellisense
Built in Visual Studio
=
Generated Output
Unit Testable
Without requiring a controller or web-server 31
Pass Data to a View
With ViewBag (dynamic type):
Action: ViewBag.Message = "Hello World!";
View: @ViewBag.Message
With ViewData (dictionary)
Action: ViewData["message"] = "Hello World!";
View: @ViewData["message"]
With Strongly-typed views:
Action: return View(model);
View: @model ModelDataType; 32
How it works?
ByUsername.cshtml HTML Output
Template + Data
= Generated
Output
UsersController.cs
UserModel.cs
33
Razor Syntax
@ – For values (HTML encoded)
<p>
Current time is: @DateTime.Now!!!
Not HTML encoded value: @Html.Raw(someVar)
</p>
@{ … } – For code blocks (keep the view simple!)
@{
var productName = "Energy drink";
if (Model != null)
{
productName = Model.ProductName;
}
else if (ViewBag.ProductName != null)
{
productName = ViewBag.ProductName;
}
}
<p>Product "@productName" has been added in your shopping cart</p>
34
Razor Syntax (2)
If, else, for, foreach, etc. C# statements
HTML markup lines can be included at any part
@: – For plain text line to be rendered
<div class="products-list">
@if (Model.Products.Count() == 0)
{
<p>Sorry, no products found!</p>
}
else
{
@:List of the products found:
foreach(var product in Model.Products)
{
<b>@product.Name, </b>
}
}
</div>
35
Razor Syntax (3)
Comments
@*
A Razor Comment
*@
@{
//A C# comment
/* A Multi
line C# comment
*/
}
What about "@" and emails?
<p>
This is the sign that separates email names from domains: @@<br />
And this is how smart Razor is:
[email protected] </p>
36
Razor Syntax (4)
@(…) – Explicit code expression
<p>
Current rating(0-10): @Model.Rating / 10.0 @* 6 / 10.0 *@
Current rating(0-1): @(Model.Rating / 10.0) @* 0.6 *@
[email protected] @*
[email protected] *@
spam_me@(Model.Rating) @* spam_me6 *@
</p>
@using – for including namespace into view
@model – for defining the model for the view
@using MyFirstMvcApplication.Models;
@model UserModel
<p>@Model.Username</p>
37
Layout
Define a common site template
Similar to ASP.NET master pages (but better!)
Razor view engine renders content inside-out
First view is redered, then layout
@RenderBody() –
indicate where we want the views based
on this layout to “fill in” their core
content at that location in the HTML
38
Views and Layouts
Views don't need to specify layout since their default layout is
set in their _ViewStart file:
~/Views/_ViewStart.cshtml (code for all views)
Each view can specify custom layout pages
@{
Layout = "~/Views/Shared/_UncommonLayout.cshtml";
}
Views without layout:
@{
Layout = null;
}
39
Sections
You can have one or more "sections" (optional)
They are defined in the views:
And may be rendered anywhere in the layout page using the
method RenderSection()
@RenderSection(string name, bool required)
If the section is required and not defined, an exception will be thrown
(IsSectionDefined()) 40
View Helpers
Each view inherits WebViewPage
ViewPage has a property named Html
Html property has methods that return string and can be used to
generate HTML
Create inputs
Create links
Create forms
Other helper properties are also available
Ajax, Url, custom helpers
41
HTML Helpers
Method Type Description
BeginForm, Form Returns an internal object that represents an HTML form that the system
BeginRouteForm uses to render the <form> tag
EndForm Form A void method, closes the pending </form> tag
CheckBox, CheckBoxFor Input Returns the HTML string for a check box input element
Hidden, HiddenFor Input Returns the HTML string for a hidden input element
Password, PasswordFor Input Returns the HTML string for a password input element
RadioButton, Input Returns the HTML string for a radio button input element
RadioButtonFor
TextBox, TextBoxFor Input Returns the HTML string for a text input element
Label, LabelFor Label Returns the HTML string for an HTML label element
42
HTML Helpers (2)
Method Type Description
ActionLink, RouteLink Link Returns the HTML string for an HTML link
DropDownList, List Returns the HTML string for a drop-down list
DropDownListFor
ListBox, ListBoxFor List Returns the HTML string for a list box
TextArea, TextAreaFor TextArea Returns the HTML string for a text area
Partial Partial Returns the HTML string incorporated in the specified user control
RenderPartial Partial Writes the HTML string incorporated in the specified user control to the
output stream
ValidationMessage, Validation Returns the HTML string for a validation message
ValidationMessageFor
ValidationSummary Validation Returns the HTML string for a validation summary message
43
Custom Helpers
Write extension methods for the HtmlHelper
Return string or override ToString method
TagBuilder manages closing tags and attributes
Add namespace in web.config (if needed)
44
Custom Helpers (2)
Another way to write helpers:
Create folder /App_Code/
Create a view in it (for example Helpers.cshtml)
Write a helper in it using @helper
You can use the helper in any view
You have a lot of code in views? => write helpers 45
Partial Views
Partial views render portions of a page
Sub-request
Reuse pieces of a view
Html helpers – Partial, RenderPartial and Action
Razor partial views are still .cshtml files
Located in the same folder as
other views or in Shared folder 46
Areas
Areas
Some applications can have a large number of controllers
ASP.NET MVC lets us partition Web applications into smaller
units (areas)
An area is effectively an MVC structure inside an application
Example: large e-commerce application
Main store, users
Blog, forum
Administration
48
Demo: Areas
ASP.NET MVC structures (areas)
Summary
Routes maps URLs to controllers and actions
Controllers are the brain of our application
Actions are the ultimate request destination
Razor is a powerful engine for combining models and templates
into HTML code
Layout, sections, partials views and helpers help us to divide our
views into pieces
Our project can be divided into smaller parts containing
controllers (areas) 50
ASP.NET MVC
? ?
sti on s ? ?
Qu e ?
?
?
https://softuni.bg/courses/asp-net-mvc/
License
This course (slides, examples, demos, videos, homework, etc.)
is licensed under the "Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International" license
Attribution: this work may contain portions from
"ASP.NET MVC" course by Telerik Academy under CC-BY-NC-SA license
52
Free Trainings @ Software University
Software University Foundation – softuni.org
Software University – High-Quality Education,
Profession and Job for Software Developers
softuni.bg
Software University @ Facebook
facebook.com/SoftwareUniversity
Software University @ YouTube
youtube.com/SoftwareUniversity
Software University Forums – forum.softuni.bg