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 – 为一个用户/角色授权控制器
- asp.net-mvc – 是否可以从HttpContext访问TempData键/值?
- asp.net-mvc – 自定义模型绑定,模型状态和数据注释
- asp.net – Web API可查询 – 如何应用AutoMapper?
- ASP.NET MVC API 接口验证的示例代码
- asp.net-mvc – 如何在ASP.NET MVC 3应用程序中处理未捕获的
- 问题在ASP.NET中使用System.Web.Caching.Cache类
- asp.net-mvc – 使用ASP.NET MVC支持“Expect:100-continu
- asp.net-mvc-3 – 如何在MVC路由中组合CatchAll和EndsWith?
- asp.net – 与web.config中的targetFramework相关的配置错误
- ASP.NET MVC Web API2 AngularJS授权和身份验证
- asp.net-mvc – 使用jQuery $.ajax()和$.post()发
- ASP.NET MVC 2 – 如何使用IgnoreRoute忽略整个目
- asp.net-mvc – 如何在不给每个控制器放置注释的
- asp.net – 请求在IIS工作进程中存在于RequestAc
- ASP.NET Webforms的MVVM模式?
- asp.net-mvc – 处理asp.net mvc中的错误和异常
- asp.net – 在WebForms中调试时关闭捆绑/缩小
- asp.net-mvc – MVC Radiobutton绑定复杂对象
- asp.net – 使用Elmah处理Web服务中的异常
