ASP.NET MVC 自定義路由中幾個須要注意的小細節

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

相關文章
相關標籤/搜索