标签:style blog http io ar os 使用 sp on
当在做MVC大型网站时,我们通常会切割成多个模块。但又由于在MVC中如果有Controller名字相同的话,会出错,那如何来解决这个问题呢?微软太人性化了,看下文。
1.新增区域
1)添加区域
2)设置区域名称
3)最后显示
2.默认路由与区域路由的优先级。
我们在打开Global.asax,如下所示
<span style="font-size:18px;"> public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//注册全部的区域路由
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
//注册路由
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}</span>
其中第一行就是我们的区域路由注册进RouteTable.Routes,正所谓“先注册先赢”,所以我们已经在区域的OrderAreaRegistration.cs定义了某个网址路由。相应的如果两个注册机制交换顺序的画,就会先比对默认的路由。
<span style="font-size:18px;"> public class OrderAreaRegistration : AreaRegistration
{
public override string AreaName
{
//对应的路由的地址文件名称
get
{
return "Order";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
//路由的比对规则
context.MapRoute(
"Order_default",
"Order/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}</span>
3.即使使用了区域,仍然可能存在名称冲突
比如在两种路由机制中有了相同的名称话,有时也可能出现冲突,解决办法如下,给指定的路由传入相应的namespace。当指定了命名空间后,MVC就不再会搜索整个网站的类别来寻找Controller,而是利用指定的命名空间去寻找。
<span style="font-size:18px;">public override void RegisterArea(AreaRegistrationContext context)
{
//路由的比对规则
context.MapRoute(
"Order_default",
"Order/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
//指定相应的命名空间,因此寻找路由的时候,就不会在发生冲突了
namespaces: new string[1] { "MvcApplication1.Areas.Order" }
);
}</span>
4.路由的高级特性
我们在做开发的时候,如何才能把控制器单独抽离出来来管理呢?什么意思呢?让MVC框架中的Controller来自于一个独自的类来管理,这样方便管理。那么先来了解一下MVC中视图的机制吧!
1.视图机制
分析:我们在上面已经知道MVC的程序入口是Global.asax类下的Application_Start方法,在这里会先注册全部的路由机制,因此当注册完区域路由和默认的路由后,就会去比对发过来的Http请求。此时就会去程序集也就是bin文件下找名字以controller结尾的,并且继承了Controller类的文件,找到后就会采取其中的路由规则一一比对。因此利用这个特性,我们可以单独建立一个类库,然后建立相应的以Controller的类,只不过让程序最终编译进MVC的程序集中即可,这样就可以找到我们的控制器。
标签:style blog http io ar os 使用 sp on
原文地址:http://blog.csdn.net/luckyzhoustar/article/details/41850053