ASP.NET MVC 中文文档3

理解MVC 的执行过程

介绍

请求一个基于ASP.NET MVCWEB应用首先要通过UrlRoutingModule 对象, 它是一个 HTTP module. 这个module解析请求并执行路由选择. UrlRoutingModule对象选择匹配当前请求的第一个路由对象. (路由对象实现RouteBase, 通常是 Route 类的实例.) 如果没有匹配的路由, UrlRoutingModule什么也不做, 然后让请求后退到常规的ASP.NET IIS 请求过程.

从选择的Route对象中, UrlRoutingModule获得了与Route 相关联的 IRouteHandler 对象. 典型的,在一个MVC 程序, 这是一个MvcRouteHandler实例. IRouteHandler 实例创建IHttpHandler 对象, 并传给他一个IHttpContext 对象. 默认的, IhttpHandler实例MvcHandler 对象. 然后MvcHandler 对象选择controller来决定如何处理请求. 更多信息, URL Routing with MVC.

Note: ASP.NET MVC Web运行在 IIS 7.0,不需要使用文件名扩展. 然而, IIS 6.0, handler需要通过映射 .mvc文件名扩展到 ASP.NET ISAPI DLL.

modulehandler ASP.NET MVC框架的入口点. 他们执行以下动作:

选择适当的controller.

获取指定的controller 实例.

调用controllerExecute方法.

下表列出了MVC Web 项目的执行阶段.

 

阶段

详细信息

接到应用的第一个请求

Global.asax 文件, Route对象被添加到了RouteTable 对象中.

执行路由

UrlRoutingModule module使用RouteTable集合中第一个匹配的 Route 对象来创建RouteData ,它将被用于创建 RequestContext (IHttpContext) 对象.

创建MVC 请求handler

MvcRouteHandler创建MvcHandler类的实例并传递给RequestContext 实例.

创建controller

MvcHandler使用RequestContext实例来识别 IControllerFactory 对象 (典型的是DefaultControllerFactory类的实例) ,并使用工厂对象创建 controller的实例.

执行controller

MvcHandler 实例调用controllerExecute 方法.

调用action

大多数controllers继承Controller 基类.controller关联的 ControllerActionInvoker 对象决定controller中的哪个方法应该被调用, 然后真的调用它.

执行结果

一个典型的action方法可能接收用户输入, 准备合适的返回数据, 然后通过result type返回结果. 内置的result types 如下: ViewResult (渲染一个视图,最常用的), RedirectToRouteResult, RedirectResult, ContentResult, JsonResult, 以及 EmptyResult.

 

 

理解MVC 中的Model

介绍

ASP.NET MVC, model是负责核心逻辑的部分. Model常用来从持久存储器访问数据, SQL Server, 在数据上执行business logic. Models是程序指定的, 因而 ASP.NET MVC model对象的类型没有约束. 比如, 你可以用ADO.NET System.Data.DataSet DataReader 对象 也可以使用自己的域对象. 你也可以组合使用来操作数据.

model没有指定类或接口. Model类不依赖于实现接口或继承自特定的类. 相反, 类是model的一部份. 是因为类在ASP.NET MVC扮演的角色, 和在程序架构中的位置. 一个model类不会直接处理从浏览器来的输入, 也不会生成HTML输出到浏览器.

定义Model

Model 对象是程序中实现域逻辑的部分, 也被当成business logic. Domain logic 处理 database UI之间的信息. 例如, 在一个库存系统, 模型跟踪货物的库存. 也包含决定库存在哪里的逻辑. 另外, model负责更新数据库,当货物卖出或者运出仓库时. Model也能在数据库中存放和检索状态.

ModelController结合

ASP.NET MVC 中提供的Models子目录是一个方便存放模型类的地方. 把模型作为一个单独类库也很普遍, 那样更便于重用.controller中使用model类通常要在方法中实例化他们, 调用模型对象的方法, 从中解析出数据显示到视图中. 这是实现actions时被推荐的方式. 同时也保持了分离, 这让测试程序逻辑更加容易,而且不用通过接口.

ASP.NET MVC 路由

介绍

ASP.NET MVC使用ASP.NET路由来映射URLscontroller类和actions. ASP.NET路由会根据你定义的模式解析URL中的变量, 并自动将变量传递到controller action作为参数. 这个主题介绍如何使用 MVC路由. 关于如何定义路由动态构造URLs, ASP.NET Routing.

添加路由到MVC

RouteCollection类的Add 方法是用来添加路由的.另外, MVC提供 MapRoute 方法和 IgnoreRoute 方法添加路由. 这些方法是 RouteCollection 类的扩展方法; MVC 外是不能调用的.

MapRoute 方法有单一的语法添加路由,因为在你添加 RouteCollection 对象之前不需要创建一个新的 Route 对象. 相反, 你要指定你要添加的 Route 对象, MapRoute 方法将为你创建 Route 实例.

IgnoreRoute方法允许你在被路由处理时执行特定的请求. 任何通过 IgnoreRoute方法添加的路由将被 StopRouteHandler 类处理. StopRouteHandler 阻止了请求中附加的处理过程, 让请求失败以通过 ASP.NET 终点处理过程.

默认路由

Visual Studio 项目模板 ASP.NET MVC 包含预配置URL路由. 这些定义在ASP.NET Application 类在Global.asax 文件.

路由的预配置让你ASP.NET MVC程序可以不需要更多配置路由, 在大多数场景下.下面是默认的路由.

Code

 

路由模式 {resource}.axd/{*pathInfo} 阻止请求WEB资源如WebResource.axd ScriptResource.axd 让他们不被传递给controller.

下表是默认路由模式.

 

默认路由模式

匹配的 URL

{controller}/{action}/{id}

http://server/application/Products/show/beverages

{resource}.axd/{*pathInfo}

http://server/application/WebResource.axd?d=...

 

 

IIS 7.0, 不需要文件名扩展. IIS 6.0, 你需要包含 .mvc 文件名扩展,在 URL pattern, 如下:{controller}.mvc/{action}/{id}

映射URLsControllerAction

一个URL请求通过 UrlRoutingModule对象路由, 然后通过 MvcHandler HTTP handler. MvcHandler HTTP handler 决定调用哪个 controller和那个action方法.

MVC URL片段加到 "Controller"前面,来确定处理请求的controller的类名. 例如, 有个URL包含URL路径 /Products,那么它对应的controller名字就是 ProductsController. Action参数位置的值就是对应的action方法的名字. 一个URL包含URL路径 /Products/show 将最终调用ProductsController 类中的Show方法.

最简单的实现一个 controller方法就是创建一个继承 System.Web.Mvc.Controller的类并让它的名字以 "Controller"结尾. 然后你可以添加公共的方法到controller类让默认的路由处理,调用对应的方法. 如果你按这个方式, 就可以依赖MVC来进行路由.

posted @ 2008-11-02 23:27  大熊(BigBear)  阅读(2395)  评论(2编辑  收藏  举报