asp.net-mvc-routing – 如何防止Url.RouteUrl(…)从当前请求继
假设您有一个操作方法在购物车中显示产品
// ProductsController.cs public ActionMethod Index(string gender) { // get all products for the gender } 在其他地方,在每个网页上显示的标头广告中,您使用Url.RouteUrl来创建指向网站上其他网页的HREF链接: <a href="<%= Url.RouteUrl("testimonials-route",new { }) %>" All Testimonials </a> 此testimonials-route在global.ascx中由第一条路线定义。 routes.MapRoute( "testimonials-route","testimonials/{gender}",new { controller = "Testimonials",action = "Index",gender = "neutral" },new { gender = "(men|women|neutral)" } ); routes.MapRoute( "products-route","products/{gender}",new { controller = "Products",gender = (string)null },new { gender = "(men|women|neutral)" } ); 如果有人访问的页面/产品/女性,我们得到一个HREF / /个人鉴定/妇女 但这没有意义吗? testimonials-route如果我们不为它提供路由值,它应该默认为“中性”? 发生的是Url.RouteUrl(routeName,routeValues)辅助扩展将首先查看其routeValues参数的性别路由值,如果它没有找到它在该字典中,它将查看当前的URL,我们’ (记住Url是一个UrlHelper对象,它具有当前请求的上下文可用)。 如果我们在男士产品页面上,这可能会给我们一个链接到男士的推荐,这可能是一个很好的效果,但是如果我们没有在RouteUrl调用中传递一个值,并明确指定“中性”作为global.asax.cs文件中的默认值。 在我们访问/ products /我们触发了“products-route”路由并调用了Products(null)方法的情况下。当我们使用testimonials-route创建一个URL时,对Url.RouteUrl()的调用实际上继承了这个性别的空值。即使我们在’testimionials-route’中指定了性别的默认值,它仍然使用这个空值,导致路由失败,RouteUrl返回null。 [注意:路由失败,因为我们有一个约束(男|女|中性),null不适合] 它实际上变得更可怕 – “控制器”和“行动”可以以同样的方式继承。这可能导致URL生成完全错误的控制器,即使调用RouteUrl(…)与显式路由名称具有默认控制器。 在这种情况下,一旦你弄清楚了,你可以很容易地解决它在许多方面,但在其他情况下可能会导致一些危险的行为。这可能是设计,但它绝对可怕。 解决方法
我的解决方案是:
HtmlExtension帮助方法: public static string RouteUrl(this UrlHelper urlHelper,string routeName,object routeValues,bool inheritRouteParams) { if (inheritRouteParams) { // call standard method return urlHelper.RouteUrl(routeName,routeValues); } else { // replace urlhelper with a new one that has no inherited route data urlHelper = new UrlHelper(new RequestContext(urlHelper.RequestContext.HttpContext,new RouteData())); return urlHelper.RouteUrl(routeName,routeValues); } } 我现在可以做: Url.RouteUrl('testimonials-route',new { },false) 并且知道它将总是表现相同的方式,无论什么上下文。 它的工作方式是使用现有的UrlHelper并创建一个空白的“RouteData”的新的。这意味着没有什么可以继承(甚至是null值)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在ASP.NET MVC中获取当前操作/控制器的自定
- 使用 xUnit 编写 ASP.NET Core WebAPI单元测试
- “超频”处理ASP.NET应用的技术
- asp.net-mvc – 是否可能在剃刀中嵌套一个窗体另一个?
- asp.net – jqgrid editurl:控制器动作参数
- asp.net-mvc – 尝试使用fiddler获取oauth令牌
- asp.net – web.config文件设置是否覆盖IIS设置?
- 如何ASP.NET Core Razor中处理Ajax请求
- asp.net-mvc – ValidateInput(false)和AllowHtml属性仍导致
- asp.net-mvc – Dotlesscss @import语句:找不到文件.使用C
- asp.net-mvc – 处理.NET MVC 2动作过滤器时的执
- asp.net-mvc – Asp.net Identity:User.Identit
- asp.net-core – Asp.Net 5 MVC 6 Startup.cs Be
- iis – 是否需要serviceAutoStartProvider属性来
- asp.net – MasterPage是否知道正在显示的页面?
- asp.net-mvc-3 – 使用asp.net MVC在Orchard CMS
- asp.net – LINQ:列表中唯一项目的计数
- asp.net – 在IHTTPHandler中以编程方式创建Syst
- asp.net – ASP Core,Identity Server 4和Angula
- asp.net-mvc – 在ASP.NET MVC中定制授权