本文主要记录在ASP.NET MVC自定义路由时,一个须要注意的参数设置小细节。 举例来讲,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定义格式的路由时,有几点要注意:框架
一、arg1/arg2/arg3 的部分应该在 routes.MapRoute 中设置默认值UrlParameter.Optional,才容许同时访问只传部分值好比 只传 arg1,或者 arg1/arg2 这样的路径url
二、在设置默认值的状况下,若是出现 http://localhost/Home/About/arg1//arg3 这样的连接,到底arg2是否有传值进来?spa
三、对于http://localhost/Home/ShowAbout/11?arg1=1&arg2=2&arg3=333 这样的连接,到底 arg1取的是1仍是11?code
如下为路由配置的代码,并无为test1和test2设置参数默认值blog
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "ShowAbout", url: "Home/ShowAbout/{arg1}/{arg2}/{arg3}", defaults: new { controller = "Home", action = "ShowAbout", arg1 = UrlParameter.Optional} ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
如下为HomeController中的相关代码路由
public JsonResult ShowAbout(string arg1, string arg2, string arg3) { return Json(arg1 + "," + arg2 + "," + arg3, JsonRequestBehavior.AllowGet); }
当咱们访问连接 http://localhost/Home/ShowAbout/arg1/arg2/arg3 时,会出现以下结果:字符串
"arg1,arg2,arg3"
但若是少了一个参数,好比访问 http://localhost/Home/ShowAbout/arg1/arg2 ,则会出现 404 的错误get
这种状况下,须要在RouteConfig中配置默认值string
routes.MapRoute( name: "ShowAbout", url: "Home/ShowAbout/{arg1}/{arg2}/{arg3}", defaults: new { controller = "Home", action = "ShowAbout", arg1 = UrlParameter.Optional, arg2 = UrlParameter.Optional, arg3 = UrlParameter.Optional } );
UrlParameter.Optional解决了无论参数是值类型仍是引用类型,在未传对应参数的状况下,都会提供一个默认值(如0或者null)io
这个时候再访问连接 http://localhost/Home/ShowAbout/arg1/arg2 ,则会出现以下结果,而不会报错
"arg1,arg2,"
当咱们传入http://localhost/Home/ShowAbout/arg1//arg3,也就是故意不传arg2的值的时候,会发现结果是
"arg1,arg3,"
也就是arg3实际传给了参数arg2的位置,两个//仍是三个///都会被忽略成一个 /
当咱们访问 http://localhost/Home/ShowAbout/11?arg1=1&arg2=2&arg3=333 这样的连接时候,发现结果是:
"11,2,333"
即当Action方法的参数是Binding类型的时候, MVC框架会将路由参数优先于查询字符串值