我所工作的网站有一些相当复杂的路由结构,我们在使用路由引擎构建URL时遇到了一些困难。我们有一个搜索结果页面,它使用基于正则表达式的模式匹配将多个变量分组到单个路由段中(例如,“www.host.com/{structuralParameters}”可以是以下内容:“www.host.com/variableA-variableB-variableC” - 其中变量A到C都是可选的)。在一些努力后,这对我们运行良好。
我们遇到的问题与ActionLink方法的一个令人恼火的特性有关:如果指向相同的控制器/操作,它将保留现有的路由值,无论您是否想要它们。我们更喜欢控制我们的链接外观,并且在某些情况下,不能保留现有的参数。一个例子是,我们网站的主导航指向没有设置参数的搜索结果页面 - 一个默认的搜索页面。我说这是一个令人恼火的特性,因为这是ASP.Net MVC框架似乎在没有明显扩展点的情况下支配实现的罕见实例 - 我们不想在我们的主页上编写自定义ActionLink代码来创建一个简单的导航链接!
我看到有些人说,您需要显式地将这些参数设置为空字符串,但是当我们尝试这样做时,它只会将参数从路由值更改为查询字符串参数。我认为我们不应该被要求显式排除我们未明确传递为参数的值,但是如果这是我们唯一的选择,我们将使用它。但是目前,如果它在查询字符串中显示,那么对于我们来说就像将参数直接放入路由一样毫无用处。
我知道我们的路由结构加剧了这个问题 - 如果我们使用更简单的方法(例如www.host.com/variableA/variableB/variableC),我们可能不会有任何问题,但我们的URL结构是不可谈判的 - 它被设计来满足与可用性、SEO和链接/内容共享相关的非常具体的需求。
如何使用Html.ActionLink生成到页面的链接,而不陷入当前路由数据(或需要显式排除路由段)的陷阱,即使这些链接指向相同的操作方法?
如果我们需要显式排除路由段,如何防止该方法将路由呈现为查询字符串参数?
这个看似小小的问题给我们带来了惊人的困扰,我将感激任何帮助解决它的方法。
编辑:根据LukLed的要求,以下是一个ActionLink调用示例:
我们遇到的问题与ActionLink方法的一个令人恼火的特性有关:如果指向相同的控制器/操作,它将保留现有的路由值,无论您是否想要它们。我们更喜欢控制我们的链接外观,并且在某些情况下,不能保留现有的参数。一个例子是,我们网站的主导航指向没有设置参数的搜索结果页面 - 一个默认的搜索页面。我说这是一个令人恼火的特性,因为这是ASP.Net MVC框架似乎在没有明显扩展点的情况下支配实现的罕见实例 - 我们不想在我们的主页上编写自定义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" }
);