1. 程式人生 > >MVC路由學習:自定義路由參數(用戶看不到參數名),重新定義路由規則

MVC路由學習:自定義路由參數(用戶看不到參數名),重新定義路由規則

route sys 工具 str optional href clas local amp

一,項目有需求將項目地址中的參數名不顯示給用戶看

在MVC定義一個方法:

     public ActionResult GetUserInfo(string Name, string Grade)
        {
            ViewBag.Name = Name;
            ViewBag.Grade = Grade;
            return View();
        }

根據一般請求路徑,我們請求的地址為:http://localhost:17273/Home/GetUserInfo?Name=1&Grade=1&Course=1,如果需要不顯示參數名,將地址改成這種http://localhost:17273/Home/GetUserInfo/1/1/1形式,而此時我們需要添加路由規則

1>找到MVC的路由文件RouteConfig.cs

2>在文件中添加一條路由,如下

            routes.MapRoute(
               name: "Querylll",
               url: "{controller}/{action}/{Name}/{Grade}/{Course}",
               defaults: new
               {
                   controller = "Home",
                   action = "Index",      
                   Name 
= UrlParameter.Optional, Course = UrlParameter.Optional }, namespaces: new string[] { "RouteDemo.Controllers" } );

UrlParameter.Optional的定義是允許不傳,造成結果是:http://localhost:17273/Home/GetUserInfo/1/1這條路由也是可以尋到該頁面
3>我們定義一個新的方法測試以上結論如下:
     public
ActionResult GetList(string Name, string Grade, string Course) { ViewBag.Name = Name; ViewBag.Grade = Grade; ViewBag.Course = Course; return View(); }
PS:但我們需要註意的一點就是:如果你需要第三個字(Course)不為空值,我們必須要傳Grade,因為根據路由規則,我們是通過URL的位置匹配參數
4>那我們使用實體接受是否可以?如下:
       public ActionResult GetListModel(UserName u)
        {
            ViewBag.Name = u.Name;
            ViewBag.Grade = u.Grade;
            ViewBag.Course = u.Course;
            return View();
        }
        public class UserName
        {
            public string Name { get; set; }
            public string Grade { get; set; }
            public string Course { get; set; }
        }    

PS:實體的定義也需要符合參數循序和規則

二,到此時,就有疑問了,如果我們的參數明會變化,那我們不就需要N條路由?這明顯不合理,那以上路由就需要改進了,如下

       routes.MapRoute(
                name: "Query",
                url: "{controller}/{action}/{param}/{param1}/{param2}",
                defaults: new
                {
                    controller = "Home",
                    action = "Index",
                    param = UrlParameter.Optional,
                    param1 = UrlParameter.Optional,
                    param2 = UrlParameter.Optional
                },
                namespaces: new string[] { "RouteDemo.Controllers" }
            );

調用和獲取的方法:

     public ActionResult GetListModel(UserName u)
        {
            u.Name = isNull("param") ? u.Name : QueryString("param").ToString();
            u.Grade = isNull("param1") ? u.Grade : QueryString("param1").ToString();
            u.Course = isNull("param2") ? u.Course : QueryString("param2").ToString();
            ViewBag.Name = u.Name;
            ViewBag.Grade = u.Grade;
            ViewBag.Course = u.Course;
            return View();
        }
     public object QueryString(string paramname)
        {
            return System.Web.HttpContext.Current.Request.RequestContext.RouteData.Values[paramname];

        }
        public bool isNull(string param)
        {
            return QueryString(param) == null ? true : false;
        }

PS,這條路由解決了參數定義的順序問題和參數名字變化等需求問題,若同一個方法有五個參數,但是當被調用時,傳如參數可能是1個,2個等情況

三,一個基於屬性的路由配置工具使用博客AttributeRouting,可以給特定的action定義路由特定的規則:AttributeRouting

      [GET("test/ddd/{a}/{b}")]
        public ActionResult TestRouting(string a, string b)
        {
            ViewBag.Name = a;
            ViewBag.Grade = b;
            return View();
        }

MVC路由學習:自定義路由參數(用戶看不到參數名),重新定義路由規則