MVC路由學習:自定義路由參數(用戶看不到參數名),重新定義路由規則
阿新 • • 發佈:2018-02-13
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>我們定義一個新的方法測試以上結論如下:
publicActionResult 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路由學習:自定義路由參數(用戶看不到參數名),重新定義路由規則