分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

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

发布时间:2023-09-06 01:42责任编辑:郭大石关键词:MVC路由参数

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

在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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved