ASP.NET MVC Framework

技术

在ASP.NET MVC架构中，除了Controller、Model与View三个主要部分以外，还包含了许多技术以让这三层得以集成并交互运作。

Controller

Controller在ASP.NET MVC应用程序中是负责中控的角色，也是来自客户端HTTP要求的处理核心，因此有许多处理与转向HTTP要求的辅助技术在Controller层次都会使用到。

ASP.NET 路由技术

用来过滤客户端要求的URL，并借由定义好的路由表(route table)将要求导向至正确的MVC Controller，并调用Controller中的Execute方法运行，而Execute方法会将HTTP动作以及实际运行的指令交给正确的函数来运行。而通常一个MVC应用程序的URL都会是类似这样的URL格式：
http://127.0.0.1/ControllerName/ActionName/ActionParameters
而MvcRouteHandler会拆解URL，找出目标的Controller，并且将ActionName以及ActionParameters传给Controller中负责的函数（以ActionName来指定）。例如下列的URL会传递给BlogController的GetList方法：
http://127.0.0.1/Blog/GetList

将数据模型与展示层直接包装

ViewPage、ViewMasterPage、ViewUserControl等展示对象都支持泛型对象，可以直接装载Model数据传递至前端输出，可简化处理Model与View之间集成的动作，只要一个参数就可以将数据传给View：
public ActionResult GetList(){
    return View(BlogDataModel);}
    Function GetList() As ActionResult
        Return View(BlogDataModel)
    End Function

Model

在 ASP.NET MVC 中，Model 相对不设限，可以使用内置的数据结构以及自定义的数据类别，也可以是一个商业对象，因此 Model 的弹性相当大，除了前述的数据结构外，微软新发展的一些数据访问方式也可以应用在Model 中，像是ADO.NET Entity Framework与LINQ to SQL等技术。
另外，MVC在服务端数据验证中，提供了ViewDataDictionary类别，这个类别中有一个ModelState属性，内含了ModelStateDictionary类别，开发人员可以利用这个类别来控制数据验证的结果，而View中输出验证消息的部分会和此类别有关系，例如下列的程序：
[AcceptVerbs(HttpVerbs.Post)]public ActionResult Create(Person person){
    if (person.Name.Trim().Length == 0)
    {
        ModelState.AddModelError("Name", "Name is required.");
    }
    if (person.Age < 1 || person.Age > 200)
    {
        ModelState.AddModelError("Age", "Age must be within range 1 to 200.");
    }
    if ((person.Zipcode.Trim().Length > 0) && (!Regex.IsMatch(person.Zipcode, @"^\d{5}$|^\d{5}-\d{4}$")))
    {
        ModelState.AddModelError("Zipcode", "Zipcode is invalid.");
    }
    if (!Regex.IsMatch(person.Phone, @"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}"))
    {
        ModelState.AddModelError("Phone", "Phone number is invalid.");
    }
    if (!Regex.IsMatch(person.Email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"))
    {
        ModelState.AddModelError("Email", "Email format is invalid.");
    }
    if (!ModelState.IsValid)
    {
        return View("Create", person);
    }

    people.Add(person);

    return RedirectToAction("Index");}
在 ASP.NET MVC 2.0 中，新增了一个可以直接让MVC Framework 针对数据字段进行验证控制的模型，称为Model Validation，它融合了在.NET Framework 3.5 SP1 发表的ASP.NET Dynamic Data Framework 中 Data Annotations (数据记号) 的特性，让开发人员可以只利用标记的方式来运行验证，或是利用自定义的代码来扩展数据记号的验证行为。
using System.ComponentModel.DataAnnotations;  
namespace MvcDA {    [MetadataType(typeof(ProductMD))]
    public partial class Product {
        public class ProductMD {            [StringLength(50),Required]
            public object Name { get; set; }            [StringLength(15)]
            public object Color { get; set; }            [Range(0, 9999)]
            public object Weight { get; set; }
          //  public object NoSuchProperty { get; set; }
        }
    }}

View

由于View是直接呈现给用户，因此与用户交互的部分都要由此层处理，包含数据的输出以及以客户端操作为主的回应（例如脚本）等。

HTML 工具类别

HTML工具类别在View中是很重要的输出工具，它内置了辅助产生HTML标签的工具方法，多数的HTML语法都可以利用它来产生，包含像链接(<a>)、窗体(<form>)以及窗体控件等等。HTML工具是以HtmlHelper类别为核心，并配合System.Web.Mvc.Html名字空间的方法，以延伸方法(Extension Method)的方式，让产生HTML的程序就有如调用方法般简单：
<h2>Index</h2><table>
    <tr>
        <th></th>
        <th>
            Id
        </th>
        <th>
            Name
        </th>
    </tr><% foreach (var person in Model) { %>

    <tr>
        <td>
            <%= Html.ActionLink("Details", "Details", person )%>
        </td>
        <td>
            <%= Html.Encode(person.Id) %>
        </td>
        <td>
            <%= Html.Encode(person.Name) %>
        </td>
    </tr><% } %></table><p>
    <%= Html.ActionLink("Create New", "Create") %></p>

数据验证

View的HTML工具可以配合Model处理数据验证的结果，在ASP.NET中常用的ValidationSummary在这里也支持，而且MVC的架构让验证信息的输出也更加弹性：
<h2>Create</h2><%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %><% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name") %> Required
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <label for="Age">Age:</label>
            <%= Html.TextBox("Age") %> Required
            <%= Html.ValidationMessage("Age", "*") %>
        </p>
        <p>
            <label for="Street">Street:</label>
            <%= Html.TextBox("Street") %>
            <%= Html.ValidationMessage("Street", "*") %>
        </p>
        <p>
            <label for="City">City:</label>
            <%= Html.TextBox("City") %>
            <%= Html.ValidationMessage("City", "*") %>
        </p>
        <p>
            <label for="State">State:</label>
            <%= Html.TextBox("State") %>
            <%= Html.ValidationMessage("State", "*") %>
        </p>
        <p>
            <label for="Zipcode">Zipcode:</label>
            <%= Html.TextBox("Zipcode") %>
            <%= Html.ValidationMessage("Zipcode", "*") %>
        </p>
        <p>
            <label for="Phone">Phone:</label>
            <%= Html.TextBox("Phone") %> Required
            <%= Html.ValidationMessage("Phone", "*") %>
        </p>
        <p>
            <label for="Email">Email:</label>
            <%= Html.TextBox("Email") %> Required
            <%= Html.ValidationMessage("Email", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset><% } %><div>
    <%=Html.ActionLink("Back to List", "Index") %></div>

应用

目前微软有一个Oxite项目，是使用ASP.NET MVC Framework所开发的博客引擎，而这个项目已经被微软的部分应用平台所采用，像是MIX Online、PDC 2009、MIX Video等官方网站都采用它来开发。另外，stackoverflow.com以及codeplex.com这两个网站也是采用ASP.NET MVC Framework。

授权

ASP.NET MVC Framework虽然是ASP.NET的一部分，不过它的源代码是透过Microsoft Public License (MS-PL)的授权模式公开，因此在MS-PL授权的范围内，任何人是可以去查看与修改它的源代码的。