摘要
本文对ASP.NET MVC的全局运行机理进行一个简要的介绍,以使得朋友们更好的理解后续文章。
前言
在上一篇文章中,我们实现了第一个ASP.NET
MVC页面。对于没有接触过这个框架的朋友来说,可能对有些地方会迷惑,所以这篇文章我将通过图示配合文字的方法,站在全局的角度介绍一些ASP.NET
MVC的运行机制,这样可以帮助朋友们更好的理解后续文章。^_^
全局
首先我们来看一副图片,由于这幅图是我自己画的,不是摘自微软官方,所以如果有什么不到位的地方还望海涵!
首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerName/ActionName/Parameters
的
样子。这个请求被ASP.NET
MVC的路由映射系统截获。(路由映射可以在Global.asax中配置,我们一会再说)路由映射系统按照映射规则,解析出控制器名
ControllerName,Action名ActionName和各个参数Parameters,然后,找寻Controllers目录下的
ControllerNameController.cs这个控制器类,默认情况下,系统总是找寻Controllers目录下的“控制器
名+Controller”这么一个类,然后,找寻这个类下与ActionName同名的方法,找到后,将Parameters作为参数传给这个方法,而
后Action方法开始执行,完成后返回相应视图,默认情况下,会返回Views目录下与ControllerName同名的目录下的与
ActionName同名的aspx文件,并且将ViewData传递到视图。ViewData中一般包含了控制视图显示的控制量以及视图显示需要的数
据。
我们按以上思路回顾一下上一篇中主页的请求过程。我们传递的url是http://localhost/Home/Index
。
默认路由规则下,将ControllerName设为“Home”,ActionName设为“Index”,没有参数。于是系统找寻
Controllers目录下的HomeController类的Index方法,成功找到,于是执行之。这个方法调用Mock的Model取出一些数
据,放入ViewData相应键值项里。然后返回视图,返回的是Views下Home下的Index.aspx。这个视图取出ViewData中的数据按
照一定格式呈现,于是完成了一次典型的ASP.NET MVC调用。
路由
从上面可以看出,ASP.NET MVC中路由是很重要的。它直接决定了如何解析url,因此决定了系统如何工作。那么,下面我们来揭开路由神秘的面纱。
打开我们Demo下的Global.asax.cs文件,可以看到如下代码:
Global.asax.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVCDemo
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// http://www.my400800.cn
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
我们拣重点说。注意上面有个routes.MapRoute方法。这个方法的作用是向系统增加一条路由规则。这里唯一的一条规则是系统默认增加的,第一个
参数是规则名,是一个普通字符串。关键是第二个参数,它也是一个字符串,但是它描述了如何解析url。可以这样理解,它描述了url串HostName后
面部分如何匹配,其中带{}的表示参数匹配,如果不带则表示字符串匹配。
例如,上面的{controller}/{action}/{id}表示如果HostName后面有三段由“/”分割的字符串,则这个url被匹配,并且分别被解析成控制器名,Action名和一个叫“id”的参数。如果你输入的是http://localhost/Home/Index/1
则后面的“1”将被当做参数id的值,但是如果你请求http://localhost/Home/Index/1/2
,抱歉,你的请求无法成功,因为这条路由规则没法匹配你的url,因为你的HostName后面有四段,而这个路由规则只能匹配三段的。
也许你还注意到一个问题,http://localhost/Home/Index
明明HostName后面只有两段,怎么也被匹配了呢?这就是MapRoute方法的第三个参数起作用了。这个参数的作用是为上面规则中各个{}匹配段设置默认值,如上,id的默认值为"",即空。所以在http://localhost/Home/Index
中,虽然没有显示指定id,但是它依然可以匹配成功,默认作为空值。如果你把其中id=""去掉,你会发现http://localhost/Home/Index
已经无法匹配了。依次类推,http://localhost/Home/
也可以匹配成功,因为{action}默认是Index,http://blog.my400800.cn/
也可以匹配成功,因为默认{controller}为Home,所以,在这条默认值下http://blog.my400800.cn/网通4006电话/1
和http://blog.my400800.cn/
是等效的。
综上分析,我们得出一条重要结论:在默认值被设置的情况下,映射规则“配少不配多”,少的部分由默认值代替。
上面的匹配规则中,三个匹配段都带大括号的,都是参数匹配,下面我们来说说强字符串匹配。例如,我们有一个url需要这样http://localhost/Category/Detail/Name
。如果按照上面的匹配规则,Name段的值会被匹配到id中去,可是我们想在CategoryController的Detail方法中使用名叫“name”的参数而不是使用名叫“id”的参数,怎么办呢?很简单,我们增加一下一条匹配规则:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVCDemo
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Category", // Route name
"Category/Detail/{name}", // URL with parameters
new { controller = "Category", action = "Detail", name = "" } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
可以看到,我们在默认规则前增加了一条规则,其中其中控制器名和Action名不再是参数,而变成了强字符串(没有{})。这时,当我们请求的url是http://localhost/Cateogry/Detail/para
的形式时,就会直接匹配新加的规则,而para的值不会被赋给成id而是赋给名叫name的变量。
需要注意的是,我们新的路由规则一定要放在前面,因为ASP.NET MVC会自上向下匹配第一条找到的可匹配路由规则。
视图
说完了路由规则,我们再来说说视图。
上面说道,Action方法返回类型是ActionResult,其实这个返回类型不局限于View方法返回ViewResult,它还有很多实现,这里列举几个。
ViewResult:一般呈现某个aspx文件,由View方法返回。
RedirectToResult:使浏览器重定向,由Redirect方法返回。
RedirectToRouteResult:直接交给下一个Action,由RedirectToAction方法返回。
还有几个,先不说了,因为后续文章基本用不到其他的,关于那几个以后朋友们可以自己看相关资料。
小结
看完这篇文章,就基本把90%的障碍扫清了。下面的文章中,将继续我们的实例。在下一篇中,我们来完成发布公告的功能,看看ASP.NET MVC下如何处理表单信息的传递。
- 大小: 24.9 KB
分享到:
相关推荐
ASP.NET MVC框架是微软推出的一款用于构建Web应用程序的开源框架,它基于模型-视图-控制器(Model-View-Controller)设计模式。在本课程中,我们将深入探讨ASP.NET MVC的正式版本,这个版本通常代表着稳定性和性能的...
Asp.Net MVC是一种基于模型-视图-控制器(Model-View-Controller)设计模式的Web应用程序开发框架。它由微软公司推出,旨在提供更灵活、可维护和测试友好的方式来构建动态网站、Web应用程序和服务。本教程将通过一...
ASP.NET MVC 扩展点是开发者能够自定义和增强框架功能的关键机制。这一概念主要围绕着如何在ASP.NET MVC框架中插入自定义逻辑,以满足特定的应用需求。在ASP.NET MVC中,扩展点主要体现在以下几个方面: 1. **...
7. **扩展性提升**:ASP.NET MVC Beta版增强了框架的可扩展性,开发者可以轻松地自定义行为,如过滤器、模型绑定器和验证器,以满足特定项目的需求。 8. **性能优化**:通过对内部组件的优化,如视图缓存和HTTP模块...
ASP.NET MVC4 CMS 是一个基于微软的ASP.NET MVC4框架构建的内容管理系统,它提供了一种高效、可扩展的方式来管理和展示网站内容。MVC(Model-View-Controller)设计模式是其核心,它将应用程序分为三个主要组件:...
总结来说,"开源:ASP.NET MVC+EF6+Bootstrap开发框架"是一个强大的开发工具集合,适合构建企业级的Web应用。ASP.NET MVC提供模型-视图-控制器架构,优化了代码组织和测试;EF6简化了数据库操作,提高了开发效率;...
ASP.NET MVC 是微软提供的一种基于模型-视图-控制器(Model-View-Controller)模式的Web应用程序开发框架。它允许开发者使用HTML、CSS和JavaScript构建动态、数据驱动的Web应用,同时提供了强大的测试支持和对现有...
ASP.NET MVC 4 in Action is a hands-on guide that shows you how to apply ASP.NET MVC effectively. After a high-speed ramp up, this thoroughly revised new edition explores each key topic with a self-...
3. **Entity Framework**:ASP.NET MVC5支持Entity Framework,一个对象关系映射(ORM)工具,简化了数据库操作,使得开发者可以使用C#对象直接操作数据库。 4. **razor视图引擎**:Razor视图引擎提供了一种简洁的...
3. **Web API**:ASP.NET Web API是构建RESTful服务的强大工具,支持JSON和XML格式的数据交换,使得与其他系统集成更加容易。 4. ** Areas**:Areas功能允许在一个大型项目中组织多个相互独立的部分,每个部分都有...
ASP.NET MVC4是一个基于模型-视图-控制器(Model-View-Controller)设计模式的开源Web应用程序框架,由微软开发。这个框架为开发者提供了一种结构化的、灵活的方式来构建高效且可测试的Web应用。本教程是全英文的,...
ASP.NET MVC 是微软开发的一款用于构建动态Web应用程序的框架,它结合了ASP.NET的优势和Model-View-Controller(MVC)设计模式的灵活性。在这个"ASP.NET MVC 项目集合.zip"压缩包中,可能包含了多个ASP.NET MVC项目...
ASP.NET MVC4是一种基于Microsoft .NET Framework的轻量级、模型-视图-控制器(MVC)框架,用于构建可维护、高性能的Web应用程序。在VS2010集成开发环境中,结合SQL2008数据库,我们可以创建出功能丰富的Web应用。...
1. ASP.NET:ASP.NET是由微软公司开发的一种服务器端的Web应用程序框架,用于构建动态网站、Web应用程序和Web服务。它支持多种编程语言,如C#、VB.NET等,并提供了丰富的工具和库来简化开发过程。 2. MVC(Model-...
ASP.NET MVC6将依赖注入作为核心功能,不再需要额外的第三方库。DI使得组件间的耦合度降低,提高了代码的可测试性和可维护性。通过注册服务,开发者可以轻松地管理应用程序中的依赖关系。 3. **Kestrel Web服务器*...
ASP.NET MVC(Model-View-Controller)是一种轻量级、基于组件的Web应用程序架构,它由微软开发并应用于.NET Framework中,为开发者提供了构建可测试、灵活且易于维护的Web应用的强大工具。本项目实例是针对初学者...
【标题】:“毕业设计:基于ASP.NET MVC2.0+Layui 权限管理系统” 这个项目是一个典型的毕业设计案例,它使用了ASP.NET MVC2.0框架与Layui前端UI库来构建一个权限管理系统。ASP.NET MVC是微软开发的一个用于构建Web...
1. 数据验证:ASP.NET MVC提供了内置的数据注解验证,可以方便地对模型数据进行客户端和服务器端验证。 2. AJAX集成:jQuery和jQuery Unobtrusive AJAX库与ASP.NET MVC紧密配合,实现了无刷新的页面更新。 3. 错误...
5. **依赖注入(Dependency Injection, DI)**:ASP.NET MVC支持DI,这是一种设计模式,用于减少代码间的耦合。通过DI,可以在运行时动态地将依赖项注入到控制器和其他组件,提高代码的可测试性和可维护性。 6. **...
4. **路由(Routing)**:ASP.NET MVC的路由系统是核心组件之一,它决定了URL请求如何映射到控制器和动作。源代码中的路由配置通常位于`Global.asax.cs`文件的`RegisterRoutes`方法中。通过自定义路由规则,开发者...