码迷,mamicode.com
首页 > Web开发 > 详细

MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则

时间:2018-02-13 16:38:02      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:mic   问题   map   lis   pre   archive   span   ring   注意   

一,项目有需求将项目地址中的参数名不显示给用户看

在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路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则

标签:mic   问题   map   lis   pre   archive   span   ring   注意   

原文地址:https://www.cnblogs.com/May-day/p/8446737.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!