一,项目有需求将项目地址中的参数名不显示给用户看
在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(); }