继承路由值比方说你有一个动作方法,在购物车中,以显示产品如何防止Url.RouteUrl(...)从当前请求
// ProductsController.cs
public ActionMethod Index(string gender) {
// get all products for the gender
}
在其他地方,在报头是
<a href="<%= Url.RouteUrl("testimonials-route", new { }) %>" All Testimonials </a>
这testimonials-route
在global.ascx
通过下面的第一个路线定义:您正在使用Url.RouteUrl
创建HREF链接到该网站上的其他网页的每一页上显示。 注意,以RouteUrl
上面的电话不提供gender
,但路线与的“中性”默认定义,因此我们预期Testimonials.Index(“中性”)被调用。
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", action = "Index", gender = (string)null },
new { gender = "(men|women|neutral)" }
);
如果有人访问/products/women
的页面,我们得到一个HREF到/testimonials/women
如果有人访问/products
页上,然后我们得到一个空的HREF(调用RouteUrl返回null)。
但是,这是没有意义的不是吗? testimonials-route
应该默认为'neutral'
对我们来说,如果我们不提供它的路由值?
什么原来的情况是Url.RouteUrl(routeName, routeValues)
帮手扩展将首先在于其routeValues
参数寻找一个gender
路线值,如果它没有在字典中找到它,它会看,我们是在当前的URL(请记住Url是一个UrlHelper对象,它具有当前可用的请求的上下文)。
如果我们在男装产品页面上,这可能会给我们一个链接到男士推荐的可能很好的效果,但如果我们没有在RouteUrl
调用中传递一个值,那可能不是我们想要的,在global.asax.cs
文件中指定“中性”作为默认值。
在我们访问/products/
的情况下,我们触发了'products-route'
路由并调用了Products(null)
方法。当我们使用testimonials-route
创建URL时,对Url.RouteUrl()
的调用实际上继承了gender
的THIS空值。即使我们在'testimionials-route
中指定了gender
的默认值,它仍会使用该空值,导致路由失败,并且RouteUrl
返回null。 [注意:路由失败,因为我们有一个约束,而null不适合]
它实际上变得更可怕 - 在'控制器'和'行动'可以继承一样的方法。即使使用具有默认控制器的明确路由名称来呼叫RouteUrl(...),也可能导致URL生成为完全错误的控制器。
在这种情况下,一旦你理解了它,你可以通过多种方式很容易地解决它,但它可以在其他情况下会造成一些危险的行为。这可能是通过设计,但它绝对可怕。
在原始问题后的一年半后添加赏金,因为(a)我想知道框架现在是否为我做了这件事,(b)我很好奇为什么这只有两个upvotes。认为这是一个普遍的问题,所以想知道如果我做错了什么! – 2011-01-01 03:06:48
这是踢我的短靴,因为{域}标签缺乏价值,但系统应该自动提供。一旦我改变了这个,它就起作用了。 – 2011-03-19 16:24:11
为什么不直接调用RenderUrl就好了:`”` - 因此,没有任何东西会被覆盖。 – Gerwald 2012-03-14 12:48:14