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

Jas*_*ker 21 asp.net-mvc t4mvc

我正在使用Partial Action将菜单直接渲染到布局,使用:

@Html.Action(MVC.Menu.Index())
Run Code Online (Sandbox Code Playgroud)

此操作确定要呈现的部分Menu.例如,公共菜单部分.在这些部分中,我也使用T4MVC来渲染链接:

<ul id="navHolder">
<li class="level1">
    <ul class="mainMenu">
        <li><b>@Html.ActionLink("Welcome", MVC.Home.Index())</b>
           ... 
Run Code Online (Sandbox Code Playgroud)

出于某种原因,T4MVC呈现的网址最后包含"?Area =":

 <ul id="navHolder">
    <li class="level1">
        <ul class="mainMenu">
            <li><b><a href="/home/index?Area=">Welcome</a></b>
               ...
Run Code Online (Sandbox Code Playgroud)

我的项目中没有区域,我将"IncludeAreasToken"设置为false.奇怪的是,只有当我使用"@ Html.Action"渲染局部时才会发生这种情况 - 如果我将其拉入"@ Html.Partial",则不会渲染参数并且链接是干净且正确的.(我不想把它渲染为部分,所以请不要提供它作为建议;)

以前有人遇到这个吗?

小智 30

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

routes.MapRoute(
"Default",
"{controller}/{action}/{i?d}",
new { controller = "Home", action = "Index", area = "", id = UrlParameter.Optional });
Run Code Online (Sandbox Code Playgroud)


Dav*_*bbo 10

这里有一些奇怪的事情,我想知道根部是否存在某种MVC错误.即使不使用T4MVC,如果您写下:

@Html.ActionLink("Welcome", "Index", "Home", new { Area = "" }, null)
Run Code Online (Sandbox Code Playgroud)

在常规视图中,这不会产生伪造的?Area =,而在Html.Action调用中它会产生.我需要问团队中的某个人.

现在,您可以通过在t4mvc.tt中删除此行(在第310行附近)来解决此问题:

<# if (MvcVersion >= 2) { #>result.RouteValueDictionary.Add("Area", area ?? "");<# } #> 
Run Code Online (Sandbox Code Playgroud)

  • 事实证明,如果app*没有任何区域,MVC只会生成虚假令牌.因此,如果应用程序使用区域,我们应该只修复T4MVC以仅添加此标记. (3认同)