加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 22:56:54 所属栏目:asp.Net 来源:网络整理
导读:我正在处理的网站有一些相当复杂的路由结构,我们遇到一些困难,路由引擎使用我们需要构建URL的方式来构建URL. 我们有一个搜索结果页面,它使用基于RegEx的模式匹配将几个变量分组为单个路由段(即“www.host.com/{structuralParameters”)可以如下:“www.host.
我正在处理的网站有一些相当复杂的路由结构,我们遇到一些困难,路由引擎使用我们需要构建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”也被无效,因为它是在无效的“行动”之后.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读