1

这是早期 stackoverflow 问题(链接文本)的后续。

如果您使用以 {id} 结尾的默认路由定义,那么如果您有一个 ActionLink,其目标与生成 ActionLink 所在页面的方法相同,则框架会自动在回调 url 中包含 id,即使您没有要求。

例如,如果您显示来自以下 URL 的页面:

http://www.somedomain.com/AController/SameMethod/456

并且页面 cshtml 文件具有如下所示的 ActionLink:

@Html.ActionLink("some text", "SameMethod", ARouteValueDictionary, SomeHtmlAttributes)

那么无论您是否在 ARouteValueDictionary 中包含“id”,它都会显示在生成的 URL 中。

仅当您回调到最初生成页面的相同方法时才会发生这种情况。如果您在同一个控制器上回调不同的方法,{id}​​ 字段不会插入到生成的 URL 中。

我不一定有这个问题。但我很好奇为什么设计师采用这种方法。

仅供参考,我发现此功能是因为我无意中在我的网站设计中依赖它。我必须将 ID 字段连同一堆其他信息一起传回服务器……只是我从未明确将 ID 信息添加到 RouteValueDictionary。但是因为我的大多数回调都是针对最初生成页面的相同操作方法,所以无论如何我都包含了信息。

当一个新组件(我确信它与已经工作的组件“基本相同”)失败时,您可以想象我的惊讶。但是由于新组件具有不同的目标操作方法,所以魔法消失了。

编辑:

修改了解释以阐明在生成的 URL 中包含 {id} 字段取决于调用与首先生成页面相同的方法。

4

1 回答 1

0

...框架自动在回调 url 中包含 id,即使您没有请求它。

我更喜欢“环境”这个词而不是“自动”这个词。您可以将 URL 中已有的路由标记视为 HtmlHelper 和 UrlHelper 的“环境”。

但我很好奇为什么设计师采用这种方法。

考虑一个组合在一起的控制器,比如 5 个动作。这 5 个可能彼此有链接,但在组外没有很多链接。最简单的 Html.Action 重载只需要 2 个参数:要呈现的文本和动作名称。

这使得在这些视图中链接从一个动作到另一个动作的简写。由于它们都在同一个控制器上,并且该控制器已经在当前操作的路径中,因此当您未在辅助方法中指定控制器名称时,MVC 会重用此值。相同的行为扩展到 {id} 或您定义的任何其他路由标记。

于 2012-07-14T07:10:37.033 回答