Zac*_*eth 13 asp.net-mvc routing actionlink
我正在研究的网站有一些相当复杂的路由结构,我们在使用路由引擎来构建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" }
);
Run Code Online (Sandbox Code Playgroud)
Eil*_*lon 21
在调用Html.ActionLink或Html.RouteLink(或任何URL生成方法)时将路由值设置为null或空字符串将清除"环境"路由值.
例如,使用标准MVC控制器/ action/id路由假设您在"Home/Index/123"上.如果你打电话Html.RouteLink(new { id = 456 }),然后MVC会注意到的"环境"路线值controller="Home"和action="Index".它还会注意到环境路由值,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"无效,因为它是在无效的"action"之后出现的".
| 归档时间: |
|
| 查看次数: |
8690 次 |
| 最近记录: |