T4MVC @ Url.Action(MVC.Controller.Action())在QueryString中呈现“?Area =”参数

时间:2011-07-20 00:32:31

标签: 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.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”,则不会渲染参数并且链接是干净且正确的。 (我不想把它渲染为部分,所以请不要提供它作为建议;)

之前有人遇到过这个问题吗?

3 个答案:

答案 0 :(得分:30)

我以一种非常简单的方式解决了这个问题,只需添加到不在区域空区域路线中的所有路线,如下所示:

routes.MapRoute(
"Default",
"{controller}/{action}/{i​d}",
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(); 调用

这也适用于适当的属性路由。