这是早期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}字段取决于调用与首先生成页面相同的方法。
答案 0 :(得分:0)
...框架自动在回调网址中包含id, 即使你没有要求它。
我更喜欢“环境”一词而不是“自动”。您可以将URL中已经存在的路径令牌视为HtmlHelper和UrlHelpers的“环境”。
但我很好奇设计师采用这种方法的原因。
考虑一个组合在一起的控制器,比如5个动作。这5个可能相互链接,但不是组外的很多链接。 Html.Action最简单的重载只需要2个参数:要渲染的文本和动作名称。
这使得在这些视图中将动作与动作之间的链接简化。由于它们都在同一个控制器上,并且该控制器已经在当前操作的路径中,因此当您未在辅助方法中指定控制器名称时,MVC会重用此值。相同的行为扩展到{id}或您定义的任何其他路由令牌。