ASP.NET MVC Framework
此条目需要更新。 (2013年11月19日) |
ASP.NET MVC Framework是微软在ASP.NET中所添加的一组类别库,这组类别库可以使用Model-View-Controller的设计模式来开发ASP.NET的应用程式。它与现有的ASP.NET应用程式并没有冲突,所以两者是可以并行的。ASP.NET MVC Framework被包装在System.Web.Mvc.dll中,并利用ASP.NET Routing来支援动作流以及URL Rewriting的能力,让它可以更贴近Web的发展以及Web 2.0的特性。对于多数有ASP开发经验的开发人员来说看起来比较不陌生,但对于没有接触过像ASP、PHP、JSP、Perl这些Web开发工具的开发人员来说,相对的不容易入门。ASP.NET MVC 的第一个版本于2009年3月17日释出RTM版本,最新的ASP.NET MVC 5.2则是于2014年12月24日正式发行。
开发者 | Microsoft |
---|---|
最终版本 | |
源代码库 | |
编程语言 | .NET 程式语言,例如C#、VB.NET |
继任 | ASP.NET Core |
类型 | Web应用程式、MVC |
许可协议 | Apache License 2.0 |
网站 | www |
微软于 ASP.NET Core 中提出下一代的 MVC 框架,称为 ASP.NET Core MVC。
原理
编辑ASP.NET MVC是遵循软体模式的Model-View-Controller来发展,其中Model指的是资料或是业务逻辑元件,View是呈现给使用者看的资讯,而Controller则是接取来自使用者的指令与资料,并将Model与View做整合的控制器,当伺服器接到对ASP.NET MVC应用程式的要求时,伺服器(IIS)会先使用UrlRoutingModule(ASP.NET Routing的 HTTP 模组),由它来解析是否有包含ASP.NET MVC应用程式的URL,若有,则会产生一个MvcRouteHandler物件,这个物件会装载执行的必要资讯,并且会呼叫包含在URL中的Controller的Execute方法来执行工作[3]。
Controller物件是基于IController
介面的规则所定义,提供针对HTTP要求做回应的一个执行工具,在ASP.NET MVC中已实作一个预设的类别 Controller,提供了必要的基础功能,另外也发展了一个 Controller 工厂,称为 Controller Factory,以IControllerFactory
介面定义,亦提供了DefaultControllerFactory,开发人员可以利用基本的类别以及利用它们来衍生自己的 Controller 或 Controller Factory 来实作自己的控制器逻辑功能。
Model物件则是为ASP.NET MVC提供资料,不过它没有基础类别,而是使用.NET Framework一般性的资料结构或是现在的ADO.NET资料物件,像是List、Dictionary、DataTable、DataReader与DataSet等等,当然也可以是自己开发的商业物件,这些资料会透过ASP.NET MVC的ModelBinder工具类别来与Controller整合,ModelBinder本身是支援泛型(Generic)的,因为各种型别的资料它都可以使用。在ASP.NET MVC中提供了一个DefaultModelBinder物件,可支援大多数的.NET Framework资料型别,以及阵列和已实作像是IList、IDictionary以及ICollection等介面的物件[4]。
Model会在Controller执行动作时,作为一个ActionResult物件方式传回给MvcHandler物件,而这个物件即会指定要显示的View物件,像是下列程式码所示:
using System.Linq;
using System.Web.Mvc;
using System.Web;
using System;
// GET: /Person/
public ActionResult Index()
{
return View(people);
}
// GET: /Person/Details/5
public ActionResult Details(Person person)
{
return View(person);
}
// GET: /Person/Create
public ActionResult Create()
{
return View();
}
// POST: /Person/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Person person)
{
if (!ModelState.IsValid)
{
return View("Create", person);
}
people.Add(person);
return RedirectToAction("Index");
}
|
Public Class HomeController
Inherits System.Web.Mvc.Controller
'GET: /Person/
Function Index() As ActionResult
Return View(people)
End Function
'GET: /Person/Details/5
Function Details(Person person) As ActionResult
Return View(person)
End Function
'GET: /Person/Create
Function Create() As ActionResult
Return View()
End Function
'POST: /Person/Create
<AcceptVerbs(HttpVerbs.Post)>
Function Contact() As ActionResult
If ModelState.IsValid Then
Return View("Create", person)
Else
people.Add(person)
Return RedirectToAction("Index")
End If
End Function
End Class
|
View物件以IView
与IViewDataContainer
等介面为主,并且以ASP.NET的各式前端介面为主要输出工具,基于MVC的View弹性化设计考量,以往在ASP.NET Web Form的程式码与HTML分离模式将不再存在,而是将程式码与HTML混合的方式设计,让开发人员可以更精确的对View进行控制,而目前 ASP.NET MVC 支援的 View 有下列几种[5]:
- .aspx网页,由ViewPage来支援。
- .ascx使用者控制项,由ViewUserControl来支援。
- .master主版页面,由ViewMasterPage来支援。
每个 View 物件都会内含一个泛型的参数,用来装载要呈现的资料(即Model),然后使用类似下面的方式来呈现资料:
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html >
<head runat="server">
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
<link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="page">
<div id="header">
<div id="title">
<h1>My MVC Application</h1>
</div>
<div id="logindisplay">
<% Html.RenderPartial("LogOnUserControl"); %>
</div>
<div id="menucontainer">
<ul id="menu">
<li><%= Html.ActionLink("Home", "Index", "Home")%></li>
<li><%= Html.ActionLink("About", "About", "Home")%></li>
</ul>
</div>
</div>
<div id="main">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
<div id="footer">
</div>
</div>
</div>
</body>
</html>
|
技术
编辑在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
动作与方法直接整合
编辑ASP.NET MVC利用了中介资料的技术,直接将方法对应到指定的 HTTP 动词 (GET/POST/PUT/DELETE/HEAD等),MvcHandler会判断要求的类别,并将它交给URL中指定的方法来处理。目前MVC Framework可用下列的方式指定(均包含在 HttpVerbs 列举型别中):
HttpVerbs.Get
HttpVerbs.Post
HttpVerbs.Delete
HttpVerbs.Put
HttpVerbs.Head
将资料模型与展示层直接包装
编辑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的程式就有如呼叫方法般简单[6]:
<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的架构让验证资讯的输出也更加弹性[7]:
<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>
不同类型的输出
编辑每一个Controller中负责回应的方法,都会回传一个ActionResult物件的资讯,ActionResult是一个执行结果物件的封装体,当MvcHandler执行完指令接到ActionResult时,就会依照它的内容来输出资料。目前MVC Framework支援的ActionResult有下列几种:
ViewResult
物件,这个物件内装载了IView
介面的资讯,以及IViewEngine
的资讯,实际产生输出资料的会是 IViewEngine,以及其指示的 View 物件。PartialViewResult
物件,与ViewResult
相似,但它回传的是"部份展示",即使用者控制项的View。ContentResult
物件,装载由使用者自订的 Content-Type 以及资料。EmptyResult
物件,表示不回传任何东西。HttpUnauthorizedReuslt
物件,表示动作没有被授权(即 HTTP 401)的错误讯息。JavaScriptResult
物件,表示回传的是JavaScript指令码。JsonResult
物件,表示回传的是JSON资料。FileResult
物件,表示回传的是一个档案资料。RedirectResult
物件,表示回传的是一个重导向 (HTTP Redirect) 指令。RedirectToRouteResult
物件,与 RedirectResult 类似,但是它是重导向给一个 Route 的路径。
透过多类型的ActionResult,开发人员可以自由决定要回传的资料的类型与格式。
应用
编辑目前微软有一个Oxite专案,是使用ASP.NET MVC Framework所开发的部落格引擎,而这个专案已经被微软的部份应用平台所采用,像是MIX Online、PDC 2009、MIX Video等官方网站都采用它来开发[8]。另外,stackoverflow.com以及codeplex.com这两个网站也是采用ASP.NET MVC Framework。
版本历程
编辑日期 | 版本 | 注释 |
---|---|---|
2007-12-10 | ASP.NET MVC Framework | 以CTP方式释出 |
2008-03-05 | ASP.NET MVC Preview 2 | 已释出 |
2008-05-01 | ASP.NET MVC Preview 3 | 已释出 |
2008-07-16 | ASP.NET MVC Preview 4 | 已释出[9] |
2008-08-28 | ASP.NET MVC Preview 5 | 已释出[10] |
2008-10-16 | ASP.NET MVC Beta | 已释出[11] |
2009-01-27 | ASP.NET MVC RC | 已释出[12] |
2009-03-03 | ASP.NET MVC RC 2 | 已释出[13] |
2009-03-17 | ASP.NET MVC 1.0 | 已释出[14] |
2009-07-31 | ASP.NET MVC 2.0 Preview 1 | 已释出[15] |
2009-11-17 | ASP.NET MVC 2.0 Beta | 已释出[16] |
2010-03-11 | ASP.NET MVC 2.0 RTM | 已释出[17] |
2010-10-06 | ASP.NET MVC 3.0 Beta | 持续更新中[18] |
2010-11-08 | ASP.NET MVC 3.0 RC | 已释出[19] |
2011-01-13 | ASP.NET MVC 3.0 RTM | 已释出[20] |
2011-09-20 | ASP.NET MVC 4.0 Developer Preview | 已释出[21] |
2012-02-15 | ASP.NET MVC 4.0 Beta | 随著Microsoft .NET Framework 4.5 RC释出[22] |
2012-05-31 | ASP.NET MVC 4.0 RC | [23] |
2012-08-15 | ASP.NET MVC 4.0 | [23] |
2013-10-17 | ASP.NET MVC 5.0 | [24] |
2014-01-17 | ASP.NET MVC 5.1 | [25] |
2014-2-10 | ASP.NET MVC 5.1.1 | |
2014-4-4 | ASP.NET MVC 5.1.2 | |
2014-6-22 | ASP.NET MVC 5.1.3 | |
2014-7-1 | ASP.NET MVC 5.2 | [26] |
2014-8-28 | ASP.NET MVC 5.2.2 | |
2015-2-9 | ASP.NET MVC 5.2.3 | |
2018-2-12 | ASP.NET MVC 5.2.4 | [27] |
2018-5-2 | ASP.NET MVC 5.2.5 | [28] |
2018-5-11 | ASP.NET MVC 5.2.6 | |
2018-11-29 | ASP.NET MVC 5.2.7 | |
2022-4-12 | ASP.NET MVC 5.2.8 (最新版) |
授权
编辑ASP.NET MVC Framework虽然是ASP.NET的一部份,不过它的原始码是透过Microsoft Public License (MS-PL)的授权模式公开,因此在MS-PL授权的范围内,任何人是可以去检视与修改它的原始码的。[29]
ASP.NET MVC Razor Engine
编辑微软在2010年7月2日由Scott Guthrie发表新的MVC绘制引擎 (Render Engine):Razor Engine[30],它已内建于 ASP.NET MVC 3.0 中发布,它具有下列功能:
- 更轻量化且直觉的语法,减少在 View 中输出资料时使用的语法,让 View 的指令更加简洁,例如使用 "@" + 变数名称 的方式,就可以输出程式中的变数,不必再用 <% %> 来设定。如果程式有多行,可以使用 @{ } 的方式来设定。
- 容易学习。
- 可相容于现在的程式语言 (ex: C#)。
- 透过 Visual Studio,可享有 Intellisense 能力。
- 可混用 HTML 与程式语言指令。
- 可用各种不同的文字编辑器编辑。
- 具有单元测试的能力。
参考资料
编辑- ^ Release 3.3.0. 2023年10月24日 [2023年11月18日].
- ^ Release 8.0.2. 2024年2月13日 [2024年2月18日].
- ^ Controllers and Action Methods in MVC Applications. [2009-08-31]. (原始内容存档于2009-08-21).
- ^ Models and Model Binders in MVC Application. [2009-08-31]. (原始内容存档于2009-08-15).
- ^ Views and UI Rendering in MVC Applications. [2009-08-31]. (原始内容存档于2009-09-08).
- ^ Models and Model Binders in MVC Applications. [2009-08-31]. (原始内容存档于2009-08-15).
- ^ Validating Model Data in an MVC Application. [2009-08-31]. (原始内容存档于2009-08-19).
- ^ Oxite Refers. [2009-08-31]. (原始内容存档于2009-08-15).
- ^ ASP.NET MVC Preview 4 Released - Shiju Varghese's Blog. Retrieved from http://weblogs.asp.net/shijuvarghese/archive/2008/07/16/asp-net-mvc-preview-4-released.aspx (页面存档备份,存于互联网档案馆)
- ^ ASP.NET MVC CodePlex Preview 5 Release Notes. Retrieved from http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=aspnet&ReleaseId=16775 (页面存档备份,存于互联网档案馆).
- ^ http://go.microsoft.com/fwlink/?LinkID=129910&clcid=0x409[永久失效链接]
- ^ http://go.microsoft.com/fwlink/?LinkID=141184&clcid=0x409
- ^ http://go.microsoft.com/fwlink/?LinkId=144443[永久失效链接]
- ^ http://go.microsoft.com/fwlink/?LinkId=144444[永久失效链接]
- ^ http://go.microsoft.com/fwlink/?LinkID=154409[永久失效链接]
- ^ 存档副本. [2009-11-18]. (原始内容存档于2009-11-21).
- ^ 存档副本. [2010-04-02]. (原始内容存档于2010-04-01).
- ^ 存档副本. [2010-11-24]. (原始内容存档于2010-11-22).
- ^ 存档副本. [2010-11-25]. (原始内容存档于2012-07-09).
- ^ 存档副本. [2011-01-19]. (原始内容存档于2011-01-19).
- ^ 存档副本. [2012-06-21]. (原始内容存档于2012-05-29).
- ^ 存档副本. [2012-06-21]. (原始内容存档于2012-06-21).
- ^ 23.0 23.1 存档副本. [2012-06-21]. (原始内容存档于2012-06-19).
- ^ 存档副本. [2014-02-05]. (原始内容存档于2014-02-22).
- ^ 存档副本. [2014-02-05]. (原始内容存档于2014-02-22).
- ^ 存档副本. [2016-02-16]. (原始内容存档于2016-02-23).
- ^ Announcing ASP.NET MVC 5.2.4, Web API 5.2.4, and Web Pages 3.2.4. Microsoft. 12 February 2018 [14 March 2018]. (原始内容存档于2019-01-23).
- ^ Announcing ASP.NET MVC 5.2.5, Web API 5.2.5, and Web Pages 3.2.5. Microsoft. 2 May 2018 [4 May 2018]. (原始内容存档于2019-01-17).
- ^ ASP.NET MVC 1.0 on ScottGu blog. [2009-08-31]. (原始内容存档于2012-03-26).
- ^ Introducing “Razor” – a new view engine for ASP.NET. [2010-11-08]. (原始内容存档于2010-11-10).
外部网站
编辑- ASP.NET MVC 官方网站(页面存档备份,存于互联网档案馆)
- MSDN ASP.NET Virtual Labs(页面存档备份,存于互联网档案馆)
- ASP.NET MVC Documentations(页面存档备份,存于互联网档案馆)