路由

  

  如果把mvc当作一个运输线,模型就是各环节中货物,那么路由就是指路牌。

  asp.net mvc中有一条简约开发原则:约定优于配置,默认创建的项目中有Controller、Views、Models这么几个文件夹,如果为了项目需要也可以把他们分开封装成类库,但是这样会失去vs提供的“脚手架”功能。

  

  http请求会先经过路由找到对应的Controller。

  

  默认Global文件中的样子(大概...):

public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );

        }

        protected void Application_Start()
        {
            //System.Diagnostics.Process.Start("net.exe ","use \\\\192.168.1.69\\web123 webiis123 /user:webiis ");//虚拟目录建立信任
            AreaRegistration.RegisterAllAreas();
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
RegisterGlobalFilters方法用来添加全局filter。
Application_Start注册全局filter,注册路由,注册Area(也涉及到路由)。

RegisterRoutes就是路由的配置,一般我会
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute("NoAction", "{controller}.html",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });//无Action的匹配

            routes.MapRoute("NoID", "{controller}/{action}.html",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });//无ID的匹配

            routes.MapRoute("Default", "{controller}/{action}/{id}.html",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });//有ID的匹配

            routes.MapRoute("Old", "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });//默认匹配
        }

后面加上.html是为了url看起来更cooooool一点...

完了。

 

PS:项目较大就涉及到Area,Area的路由配置也很简单,但是显得很蛋疼

先建的area里面有继承了AreaRegistration的类,有重写AreaName属性,返回的就是Area的名称,另外

public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Area1",
                "Area1/{controller}/{action}/{id}",
                new {  controller = "Home", action = "Index", id = UrlParameter.Optional }, null, newstring[] { "命名空间.Controllers.*" } ); }

可以通过路由来实现一些文件请求的处理或者防盗链之类的功能。

 

虽然路由是一个一劳永逸的东西,不建议配置的太过复杂。

 
 
 
posted on 2013-11-12 14:36  阿蛆  阅读(156)  评论(0)    收藏  举报