设置URL路由

URL路径中,大括号{}内部的代表参数。/作为分割符,不再大括号内的则作为常量。值得注意的是,{controller}和{action}作为2个关键字由MVC路由控制,如果确实需要用这个名字命名参数,可以在前面加上@,例如{@action}。

默认的设置路由在Global.asax文件中

public static void RegisterRoutes(RouteCollection routes)方法

routes.MapRoute(

                "Default", // Route name

                "{controller}/{action}/{id}", // URL with parameters

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

            );

new { controller = "Home", action = "Index", id = UrlParameter.Optional }是MapRoute中的默认值,意思就是什么都不输入的时候,controller的值和action的值也是必须有值的。

controller代表控制器,action代表这个控制器中的方法。必须要指定默认的controller和action,不然会报错。

 routes.MapRoute(

                "Default", // Route name

                "{controller}/{action}/{id}", // URL with parameters

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

            );

实际上是以下方法的一种简写形式:

Route myRoute = new Route("{controller}/{action}/{id}", new MvcRouteHandler())

{

Defaults = new RouteValueDictionary( new {

controller = "Home", action = "Index", id = UrlParameter.Optional

})

};

routes.Add("Default", myRoute);

路由的顺序也是十分重要,URL被一次匹配每个路由模式,一旦匹配成功,就不再继续匹配下去。这点要注意。例如:

routes.MapRoute(

"Default", // Route name

"{controller}/{action}/{id}", // URL with parameters

new { controller = "Home", action = "Index", // Parameter defaults

id = UrlParameter.Optional }

);

routes.MapRoute(

"Specials", // Route name

"DailySpecials/{date}", // URL with parameters

new { controller = "Catalog", action = "ShowSpecials" } // Parameter defaults

);

这里的Specials将不会被匹配到。

URL路由匹配的时候只匹配路径部分,域名和QueryString不会被匹配到。

路由约束

可以使用正则表达式对参数进行验证约束

routes.Add(new Route("Articles/{id}", new MvcRouteHandler())

{

Defaults = new RouteValueDictionary(

new { controller = "Articles", action = "Show" }

),

Constraints = new RouteValueDictionary(new { id = @"\d{1,6}",id22=@"\d{1,6}" })

});

上面部分可以简写为如下代码:

routes.MapRoute(null, "Articles/{id}",

new { controller = "Articles", action = "Show" },

new { id = @"\d{1,6}",id22=@"\d{1,6}" }

);

不定长度的路径

使用*号匹配不定长度。

 

routes.MapRoute(null, "Articles/{*articlePath}",

new { controller = "Articles", action = "Show" }

);

可以匹配/Articles/Science/Paleontology/Dinosaurs/Stegosaurus

 

匹配硬盘上的文件

尽管设置了路由,但是如果在一些特殊的情况下,硬盘上真实存在的文件和路由的URL一致,这时系统会处理硬盘真实存在的文件,而无视路由的存在。

要解决这个问题,使得无论是否匹配了真实存在的文件,都按照路由的URL来处理,应该在Application_Start()中如下写:

protected void Application_Start()

        {

            AreaRegistration.RegisterAllAreas();

            RouteTable.Routes.RouteExistingFiles = true;

            RegisterRoutes(RouteTable.Routes);

        }

RouteTable.Routes.RouteExistingFiles默认是false。

这样设置了,就算文件真实存在都会按照路由的方式处理。除了下面2种情况:

1.没有任何匹配的路由。则仍然按照真实文件处理。

2.使用了IgnoreRoute(),无视了一些路由。

posted on 2012-09-06 17:41  W晴空  阅读(373)  评论(0编辑  收藏  举报