asp.net-mvc – 如何阻止ASP.Net MVC Html.ActionLink使用现有的路由值?

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 如何阻止ASP.Net MVC Html.ActionLink使用现有的路由值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在处理的网站有一些相当复杂的路由结构,我们遇到一些困难,路由引擎使用我们需要构建URL的方式来构建URL.

我们有一个搜索结果页面,它使用基于RegEx的模式匹配将几个变量分组为单个路由段(即“www.host.com/{structuralParameters”)可以如下:“www.host.com/variableA-variableB- variableC“ – 其中变量A到C都是可选的).这对我们来说是一个很好的工作.

我们遇到的问题解决了ActionLink方法的一个令人讨厌的功能:如果您指向相同的控制器/操作,它将保留现有的路由值,无论您是否需要它们.我们更喜欢控制我们的链接的外观,在某些情况下,不能保留现有的参数.一个例子是我们的网站的主导航导致没有参数设置的搜索结果页面 – 默认搜索页面,如果你愿意的话.我说这是一个令人讨厌的功能,因为它是ASP.Net MVC框架的一个罕见的例子,似乎在没有明显的扩展点的情况下执行实现 – 我们不希望创建自定义的ActionLink代码来在我们的母版页中编写一个简单的导航链接

我看到有人说你需要明确地将这些参数设置为空字符串,但是当我们尝试这个参数时,只需将参数从路由值更改为查询字符串参数.对我来说似乎不对,我们应该被要求明确排除我们没有作为参数显式传递给ActionLink方法的值,但是如果这是我们唯一的选择,我们将使用它.然而,目前如果它在查询字符串中显示,那么对于我们将参数直接放入路由是没有用的.

我知道我们的路由结构会使这个问题更加激化 – 如果我们使用一个更简单的方法(例如www.host.com/variableA/variableB/variableC),但是我们的URL结构是不可协商的 – 我们可能没有任何问题旨在满足与可用性,SEO链接/内容共享有关的非常具体的需求.

我们如何使用Html.ActionLink生成页面链接,而不会退回当前的路由数据(或者如果可能的话,需要明确排除路由段),即使这些链接导致相同的操作方法

如果我们确实需要明确排除路由段,我们该如何防止该方法将路由呈现为查询字符串参数?

这个看似小的问题使我们感到惊讶的是,我会感谢任何帮助解决问题.

编辑:按照LukLed的要求,下面是一个ActionLink调用示例:

// I've made it generic,but this should call the Search action of the 
// ItemController,the text and title attribute should say "Link Text" but there
// should be no parameters - or maybe just the defaults,depending on the route.
// 
// Assume that this can be called from *any* page but should not be influenced by
// the current route - some routes will be called from other sections with the same
// structure/parameters.
Html.ActionLink( 
    "Link Text","Search","Item",new { },new { title = "Link Text" } 
);

解决方法

调用Html.ActionLink或Html.RouteLink(或任何URL生成方法)时,将路由值设置为空或空字符串将清除“环境”路由值.

例如,使用标准的MVC controller / action / id路由,假设您处于“Home / Index / 123”.如果您调用Html.RouteLink(new {id = 456}),则MVC将注意到controller =“Home”和action =“Index”的“ambient”路由值.它还会注意到id =“123”的环境路由值,但会被显式“456”覆盖.这将导致生成的URL为“Home / Index / 456”.

参数的顺序也很重要.例如,说你叫Html.RouteLink(new {action =“About”}). “关于”操作将覆盖当前的“索引”操作,“id”参数将被完全清除!但为什么,你问?因为一旦使一个参数段无效,那么它之后的所有参数段将被无效.在这种情况下,“action”被一个新的显式值无效,因此它后面的“id”也没有明确的值也被无效.因此,生成的URL将只是“Home / About”(没有ID).

在同样的情况下,如果您调用Html.RouteLink(new {action =“”}),则生成的URL将只是“Home”,因为您使用空字符串使“action”无效,然后导致“id”也被无效,因为它是在无效的“行动”之后.

猜你在找的asp.Net相关文章