MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则
MVC路由:由于路由global中注冊(cè)了,在程序第一次運(yùn)行時(shí),在MVC會(huì)自動(dòng)生成路由,類似于字典的格式緩存下來(lái),但路由生成的規(guī)則又是怎樣的呢?
路由生成規(guī)則是:
1》更具你定義的的順序查找路由規(guī)則,如果有匹配的,就會(huì)生成路由,生成一條后,不會(huì)繼續(xù)查找下去,結(jié)束第一條路由的生成,從而接著一樣的方法第二第三條生成
2》那是怎么查找路由的呢?我們來(lái)看下面代碼來(lái)解釋:
routes.MapRoute(name: "Test",url: "{controller}/{action}/{param1}",defaults: new{controller = "Test",action = "Index",param1 = UrlParameter.Optional,},constraints: new{controller = "^Test.*",action = new ActionConstraints(),// "^transfer.*",param1 = @"\d+",});1》在這里假設(shè)我們當(dāng)前路由是在順序的第一,一開始在讀取路由規(guī)則,都是先讀這條,如果你的constraints規(guī)則不適應(yīng)才會(huì)尋找下一跳生成路由,如果符合,就會(huì)直接生成路由,接著重新遍歷這規(guī)則,生成下一跳路由
一,項(xiàng)目有需求將項(xiàng)目地址中的參數(shù)名不顯示給用戶看
在MVC定義一個(gè)方法:
public ActionResult GetUserInfo(string Name, string Grade){ViewBag.Name = Name;ViewBag.Grade = Grade;return View();}根據(jù)一般請(qǐng)求路徑,我們請(qǐng)求的地址為:http://localhost:17273/Home/GetUserInfo?Name=1&Grade=1&Course=1,如果需要不顯示參數(shù)名,將地址改成這種http://localhost:17273/Home/GetUserInfo/1/1/1形式,而此時(shí)我們需要添加路由規(guī)則
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的定義是允許不傳,造成結(jié)果是:http://localhost:17273/Home/GetUserInfo/1/1這條路由也是可以尋到該頁(yè)面3>我們定義一個(gè)新的方法測(cè)試以上結(jié)論如下:
public ActionResult GetList(string Name, string Grade, string Course){ViewBag.Name = Name;ViewBag.Grade = Grade;ViewBag.Course = Course;return View();} PS:但我們需要注意的一點(diǎn)就是:如果你需要第三個(gè)字(Course)不為空值,我們必須要傳Grade,因?yàn)楦鶕?jù)路由規(guī)則,我們是通過(guò)URL的位置匹配參數(shù)
4>那我們使用實(shí)體接受是否可以?如下:
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:實(shí)體的定義也需要符合參數(shù)循序和規(guī)則
二,到此時(shí),就有疑問(wèn)了,如果我們的參數(shù)明會(huì)變化,那我們不就需要N條路由?這明顯不合理,那以上路由就需要改進(jì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" });調(diào)用和獲取的方法:
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,這條路由解決了參數(shù)定義的順序問(wèn)題和參數(shù)名字變化等需求問(wèn)題,若同一個(gè)方法有五個(gè)參數(shù),但是當(dāng)被調(diào)用時(shí),傳如參數(shù)可能是1個(gè),2個(gè)等情況
三,那如果我們要寫一個(gè)路由,只能是某一個(gè)控制器,并且是該控制器下某些方法可用,這是路由該怎么定義?如下代碼:
routes.MapRoute(name: "Test",url: "{controller}/{action}/{param1}/{param2}/{param3}/{param4}",defaults: new{controller = "Test",action = "Index",param1 = UrlParameter.Optional,param2 = UrlParameter.Optional, param3 = UrlParameter.Optional,param4 = UrlParameter.Optional,},constraints: new{controller = "^Test.*",action = new ActionConstraints(),// "^Test.*", });我們需要在constrationts定義controllers的默認(rèn)值即可,action我們就需要使用正則來(lái)判斷,如下代碼
public class ActionConstraints : IRouteConstraint{public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection){string val = values[parameterName].ToString();if (Regex.IsMatch(val, "^Test.*", RegexOptions.IgnoreCase) || Regex.IsMatch(val, "^Index.*", RegexOptions.IgnoreCase)){return true;}return false;}} ^Test.表示當(dāng)action前綴為Test都返回true,則可以使用這條路由PS:如果想以上這種路由沒有定義controllers規(guī)則,屬于主路由,主路由不可以定義在從路由之前,這樣如果生成匹配了主路由,從路由就不會(huì)生成,則你定義的規(guī)則就不會(huì)被實(shí)現(xiàn)
?四,一個(gè)基于屬性的路由配置工具使用博客AttributeRouting,可以給特定的action定義路由特定的規(guī)則:AttributeRouting?
[GET("test/ddd/{a}/")]public ActionResult TestRouting(string a, string b){ViewBag.Name = a;ViewBag.Grade = b;return View();}?
轉(zhuǎn)載于:https://www.cnblogs.com/May-day/p/8446737.html
總結(jié)
以上是生活随笔為你收集整理的MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 洛谷P1919 【模板】A*B Prob
- 下一篇: 利用 git format-patch