本文主要記錄在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框架會將路由參數優先於查詢字符串值