ASP.NET MVC中根级ActionLink被自动追加区域名称的问题
解决MVC区域访问后根级ActionLink自动追加区域名称的问题
嘿,这个问题我碰到过好多次了,其实核心原因很简单:MVC的路由上下文会“记住”你当前所在的区域,自动把这个区域值填充到ActionLink的路由参数里,导致原本指向根目录控制器的链接跑偏到区域里去了。
为什么会出现这个情况?
当你访问区域内的某个视图时,当前请求的路由数据里已经包含了area这个参数。而Html.ActionLink默认会复用当前上下文里的所有路由值——哪怕你没在ActionLink里指定区域,它也会自动把当前的区域名称加上,结果就是链接指向了区域内的Home控制器,而不是你想要的根目录Home控制器。
怎么解决?
你只需要在ActionLink里显式指定area参数为空字符串,强制MVC忽略当前上下文的区域值,用根目录的路由规则。
把你布局页里的代码改成这样:
<div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li>@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)</li> <li>@Html.ActionLink("About", "About", "Home", new { area = "" }, null)</li> <!-- 其他非区域链接同理处理 --> </ul> </div>
这里解释一下参数:
- 第四个参数是路由值对象,
new { area = "" }告诉MVC不要使用当前的区域值,直接用空值(对应根目录路由) - 第五个参数是HTML属性,如果你不需要给链接加额外的class或样式,传
null就可以;如果需要的话,比如加个active类,就写成new { @class = "active" }
另一种写法:用Url.Action生成链接
如果你习惯用原生<a>标签,也可以用Url.Action来生成正确的根目录链接,原理是一样的:
<li><a href="@Url.Action("Index", "Home", new { area = "" })">Home</a></li>
总结
不管你在哪个区域页面,只要显式清空area路由参数,就能确保这些布局页的链接始终指向根目录的控制器,不会被当前区域的上下文带偏。
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

