MVC:ActionLink记得ID字段?

时间:2012-07-14 05:18:19

标签: asp.net-mvc asp.net-mvc-3

这是早期stackoverflow问题(link text)的后续内容。

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

例如,如果您要显示以下网址中的网页:

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

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

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

然后你是否有" id"包含在ARouteValueDictionary中,它将显示在生成的URL中。

仅当您回调到首先生成页面的相同方法时,才会出现这种情况。如果您在同一个控制器上回调其他方法,则{id}字段不会插入到生成的URL中。

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

仅供参考,我发现这个功能是因为我在网站设计中无意中依赖它。我必须将ID字段传递回服务器,以及一堆其他信息......只是我从未明确地将ID信息添加到RouteValueDictionary。但是因为我的大部分回调都是采用相同的动作方法生成页面,所以无论如何都包含了信息。

当一个新的组件 - 我确信它是基本相同的"到已经工作的 - 失败了。但是因为新组件有不同的目标动作方法,魔术就消失了。

修改

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

1 个答案:

答案 0 :(得分:0)

  

...框架自动在回调网址中包含id,   即使你没有要求它。

我更喜欢“环境”一词而不是“自动”。您可以将URL中已经存在的路径令牌视为HtmlHelper和UrlHelpers的“环境”。

  

但我很好奇设计师采用这种方法的原因。

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

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