一,项目有需求将项目地址中的参数名不显示给用户看
在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路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则
原文地址:https://www.cnblogs.com/May-day/p/8446737.html