Route使用和拓展Area
网站启动时,执行Global.asax文件中MvcApplication类中的Application_Start方法
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();//注册区域
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//注册全局的filter
RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Route路由详解
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//通过编写【忘记路由】的正则表达式过滤掉不需要的路由地址,如果当请求的后缀是.axd的那么将忽略掉这个路由。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
web程序启动执行顺序:
MVCapplication→Application_Start→RegisterRoutes–给RouteCollections添加规则
请求进到网站–X--请求地址被路由按顺序匹配–遇到一个吻合的结束–就到对应的控制器和action
- 新建一个Area
在web项目中,项目可以非常大非常复杂,多人合作开发,命名就成了问题,Area可以把项目拆分开,方便团队合作;演变到后面可以做成插件式开发:
MVCapplication→Application_Start→AreaRegistration.RegisterAllAreas(),其实就是把SystemAreaRegistration给注册下,添加下URL规则,请求来了就匹配,Area在普通的之前。
public class SystemAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "System";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"System_default",
"System/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
MVC请求的最后是反射调用的Controller+action,信息来自于URL+Route,路由匹配时,只能找到controller和action,扫描+存储,在bin文件夹中找controller子类,然后把命名空间–类+名称+全部方法存起来。
- 控制器类可以出现在MVC项目之外是可以的。唯一的规则就是继承自controller
- Area也可以独立,规则是必须有个继承AreaRegistration