asp.net-mvc-3 – ASP.net MVC路由与可选的第一个参数
我需要为其中一个网站提供以下功能.
http://www.example.com/ [赞助] / {控制器} / {行动} 根据[赞助商],必须定制网页. 我尝试将路由注册到Application_Start和Session_Start,但不能使其正常工作. public static void RegisterRoutes(RouteCollection routes,string sponsor) { if (routes[sponsor] == null) { routes.MapRoute( sponsor,// Route name sponsor + "/{controller}/{action}/{id}",// URL with parameters new { controller = "Home",action = "Index",id = UrlParameter.Optional } // Parameter defaults ); } } 另外,没有[sponsor]的默认行为也应该起作用. 更新代码 请注意,这仅适用于家庭控制器(双方和非赞助商).对于其他控制器/动作,即使指定了sponsor参数,它也不是路由. 请建议什么需要修改. public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "SponsorRoute","{sponsor}/{controller}/{action}/{id}",// URL with parameters new { controller = "Home",id = UrlParameter.Optional } ); routes.MapRoute( "NonSponsorRoute","{controller}/{action}/{id}",new { controller = "Home",id = UrlParameter.Optional,sponsor = string.Empty } ); } 行动方法 public ActionResult Index(string sponsor) { } 解决方法
在您的情况下,赞助商不应被视为URL的常数部分,而应视为可变部分.
在Global.asax中: public static void RegisterRoutes(RouteCollection routes) { ... routes.MapRoute( "SponsorRoute",id = UrlParameter.Optional } ); routes.MapRoute( "NonSponsorRoute",sponsor=string.Empty } ); ... } 在你的控制器中,例如HomeController.cs: namespace YourWebApp.Controllers { public class HomeController : Controller { public ActionResult Index(string sponsor) { // Here you can do any pre-processing depending on sponsor value,including redirects etc. } ... } } 请注意,此参数的类型将始终为System.String,并且路由模板组件{赞助者}的名称必须与控制器中操作参数字符串赞助商的名称完全相符. UPD:为非赞助者案例增加了第二条路线. 请注意,这样的设置会使您的逻辑复杂化,因为您可能会混淆不同的网址,例如URL http://www.example.com/a/b/c 可以通过两条路线匹配:第一个将有赞助者= a,controller = b和action = c;第二个将有controller = a,action = b和id = c. 如果您对URL指定了更严格的要求,则可以避免这种情况 – 例如,您可能希望ID仅为数字.限制在routes.MapRoute()函数的第四个参数中指定. 消除歧义的另一种方法是在赞助商的通用路线之前为所有控制器指定单独的路线(通常您的应用中不会有太多的控制器). UPD: 区分赞助商和非赞助商路线的最简单但最不可维护的方法是指定特定于控制器的路由,如下所示: public static void RegisterRoutes(RouteCollection routes) { ... routes.MapRoute( "HomeRoute","Home/{action}/{id}",sponsor=string.Empty } ); routes.MapRoute( "AccountRoute","Account/{action}/{id}",// URL with parameters new { controller = "Account",sponsor=string.Empty } ); ... routes.MapRoute( "SponsorRoute",id = UrlParameter.Optional } ); ... } 请注意,这里所有控制器特定的路由必须在SponsorRoute之前添加. 更复杂,更干净的方法是在@counsellorben的回答中描述,为赞助商和控制器名称实现RouteConstraints. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 将(单片)经典ASP迁移到ASP.Net
- asp.net-mvc – 在Windows Creators Update之后,ASP.NET缓存
- ASP.NET Core 3.0 使用gRPC
- asp.net-mvc – MVC 4,Upshot实体循环引用
- 关闭一个子目录的ASP.Net WebForms身份验证
- asp.net-mvc-3 – 在Razor/MVC3中显示数据库映像(bytes [])
- 存储过程 – 经典ASP – ADO执行存储过程传入??参数
- asp.net-identity – UserManager RemoveFromRole错误
- 使用asp.net核心身份将数据存储在cookie中
- asp.net-mvc-4 – 我应该如何使用ReturnUrl = ViewBag.Retu
- asp-classic – 如何在VBScript中逐行读取CSV文件
- DevExpress ASP.NET示例资源最全分享!(一)
- asp.net-mvc – ASP.NET MVC3:调试和发布应用程
- 新版本 swagger 组件中 Servers 的 坑
- asp.net – 多久我应该打开/关闭我的Booksleeve连
- ASP.NET如何确定是否排队请求?
- asp.net – window.location更改失败AJAX调用
- asp.net – 如何使用Response.OutputStream.Writ
- asp.net-mvc – ASP.NET MVC.如何创建接受和mult
- asp-classic – If子句未按预期工作