Asp.net mvc T4MVC@Url.Action(MVC.Controller.Action())呈现“;?面积=”;查询字符串中的参数
我正在使用以下命令将菜单从部分操作直接渲染到布局:Asp.net mvc T4MVC@Url.Action(MVC.Controller.Action())呈现“;?面积=”;查询字符串中的参数,asp.net-mvc,t4mvc,Asp.net Mvc,T4mvc,我正在使用以下命令将菜单从部分操作直接渲染到布局: @Html.Action(MVC.Menu.Index()) 此操作决定渲染哪个菜单部分。例如,公共菜单是局部的。在这些部分中,我还使用T4MVC呈现链接: <ul id="navHolder"> <li class="level1"> <ul class="mainMenu"> <li><b>@Html.ActionLink("Welcome", MVC.H
@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呈现的URL在末尾包括“?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”拉入,则不会呈现参数,并且链接干净且正确。(但我不想将其作为一个部分呈现,所以请不要将其作为一个建议提供;)
以前有人遇到过这种情况吗?这里发生了一些奇怪的事情,我想知道是否有某种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){#>result.RouteValueDictionary.Add(“Area”,Area??);
我以一种非常简单的方式解决了这个问题,只需向所有不在空区内的路线添加如下:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", area = "", id = UrlParameter.Optional });
从workitem 7154 comments复制的是@Davidebo提供的解决方案: 一个更简单的解决方法是在站点中添加一个虚假区域。例如。\n\n- 右键单击Project并选择Add/Area。将其命名为“Dummy”(或 无论什么)\n-您可以删除其中的所有内容,但 DummyAreaRegistration.cs文件 确保在Global.asax中调用了
AreaRegistration.RegisteralAreas();
这也适用于适当的属性路由。我刚刚添加了一个检查,以查看是否提供了区域,如果是,我将其添加到字典:
if(!String.IsNullOrWhiteSpace(area)){result.RouteValueDictionary.add(“area”,area??);}
@BradR:这个更改的问题是,我认为它并不总是正确的。当您在区域视图中,试图生成指向顶层(非区域)的链接时视图,然后传递一个空区域是“转义”当前区域的正确方法。但是,如果您的检查不会发生。事实证明,MVC仅在应用程序没有任何区域时生成伪令牌。因此,我们应该修复T4MVC,使其仅在应用程序使用区域时添加此令牌。@Davidebo是否已执行此检查?我正在了解最新的T4MVCNo也存在同样的问题,但这里有一个更简单的解决方法:刚刚测试过,这似乎是最简单的解决方案-只需在默认路由中添加一个String.Empty区域,所有URL都会正确生成。如果在项目中使用属性路由,这将不起作用。请参阅我从mvccontrib存档复制的答案,工作项目7154,因为您现在无法在存档的Codeplex站点上轻松找到它。