我使用以下方法将部分操作中的菜单直接渲染到布局:
@Html.Action(MVC.Menu.Index())
此操作确定要呈现的部分菜单。例如,公共菜单部分。在这些部分中,我也使用T4MVC来渲染链接:
<ul id="navHolder">
<li class="level1">
<ul class="mainMenu">
<li><b>@Html.ActionLink("Welcome", MVC.Home.Index())</b>
...
出于某种原因,T4MVC呈现的网址最后包含“?Area =”:
<ul id="navHolder">
<li class="level1">
<ul class="mainMenu">
<li><b><a href="/home/index?Area=">Welcome</a></b>
...
我的项目中没有任何区域,我将“IncludeAreasToken”设置为false。奇怪的是,只有当我使用“@ Html.Action”渲染局部时才会发生这种情况 - 如果我将其拉入“@ Html.Partial”,则不会渲染参数并且链接是干净且正确的。 (我不想把它渲染为部分,所以请不要提供它作为建议;)
之前有人遇到过这个问题吗?
答案 0 :(得分:30)
我以一种非常简单的方式解决了这个问题,只需添加到不在区域空区域路线中的所有路线,如下所示:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", area = "", id = UrlParameter.Optional });
答案 1 :(得分:10)
这里发生了一些奇怪的事情,我想知道根部是否存在某种MVC错误。即使不使用T4MVC,如果你写下:
也会发生这种情况@Html.ActionLink("Welcome", "Index", "Home", new { Area = "" }, null)
在常规视图中,这不会产生伪造的?Area =,而在Html.Action调用中它会产生。我需要问团队中的某个人。
目前,您可以通过在t4mvc.tt中删除此行(第310行)来解决此方法:
<# if (MvcVersion >= 2) { #>result.RouteValueDictionary.Add("Area", area ?? "");<# } #>
答案 2 :(得分:0)
从工作项 7154 条评论中复制是@DavidEbbo 提供的解决方案:
<块引用>一个更简单的解决方法是向您的网站添加一个虚假区域。例如\n\n- 右键单击项目并选择添加/区域。将其命名为“Dummy”(或 随便)\n- 你可以删除里面的所有东西,除了 DummyAreaRegistration.cs 文件
确保您的 Global.asax 中有 AreaRegistration.RegisterAllAreas();
调用
这也适用于适当的属性路由。