【问题标题】:T4MVC @Url.Action(MVC.Controller.Action()) Renders "?Area=" Parameter in QueryStringT4MVC @Url.Action(MVC.Controller.Action()) 在 QueryString 中呈现 "?Area=" 参数
【发布时间】:2011-10-09 00:03:46
【问题描述】:

我将一个菜单从部分操作直接渲染到布局,使用:

@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”拉入,则不会渲染参数并且链接是干净且正确的。 (虽然我不想将其呈现为部分内容,所以请不要将其作为建议提供;)

以前有人遇到过这种情况吗?

【问题讨论】:

    标签: asp.net-mvc t4mvc


    【解决方案1】:

    这里发生了一些奇怪的事情,我想知道根部是否存在某种 MVC 错误。即使不使用 T4MVC,如果您编写以下代码,也会发生这种情况:

    @Html.ActionLink("Welcome", "Index", "Home", new { Area = "" }, null)
    

    在常规视图中,这不会生成虚假的 ?Area=,而在 Html.Action 调用中会生成。我需要问问团队中的某个人。

    目前,您可以通过在 t4mvc.tt 中删除此行(大约第 310 行)来解决:

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

    【讨论】:

    • 我刚刚添加了一个检查以查看是否提供了该区域,如果是,我将其添加到字典中:if (!String.IsNullOrWhiteSpace(area)) {result.RouteValueDictionary.Add("Area", area ?? "");}
    • @BradR:这个变化的问题在于我认为它并不总是正确的。当您在区域视图中并尝试生成指向顶级(非区域)视图的链接时,传递一个空白区域是“逃离”当前区域的正确方法。但有了你的检查,这不会发生。
    • 事实证明,如果应用没有有任何区域,MVC 只会生成伪造的令牌。所以我们应该修复 T4MVC 以仅在应用程序使用区域时添加此令牌。
    • @DavidEbbo 此检查是否已实施?我在使用最新的 T4MVC 时遇到了同样的问题
    • 不,但这里有一个更简单的解决方法:mvccontrib.codeplex.com/workitem/7154
    【解决方案2】:

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

    routes.MapRoute(
    "Default",
    "{controller}/{action}/{i​d}",
    new { controller = "Home", action = "Index", area = "", id = UrlParameter.Optional });
    

    【讨论】:

    • 刚刚测试过,这似乎是最简单的解决方案 - 只需在默认路由中添加一个 String.Empty 区域,所有 URL 都会正确生成。
    • 如果您在项目中使用属性路由,这将不起作用。请参阅我从 mvccontrib 存档中复制的答案,工作项 7154,因为您现在无法在存档的 Codeplex 网站上轻松找到它。
    【解决方案3】:

    从workitem 7154 cmets复制的是@DavidEbbo提供的解决方案:

    一个更简单的解决方法是在您的网站上添加一个虚假区域。例如\n\n- 右键单击项目并选择添加/区域。将其命名为“虚拟”(或 随便)\n- 你可以删除里面的所有东西,除了 DummyAreaRegistration.cs 文件

    确保您的 Global.asax 中有 AreaRegistration.RegisterAllAreas(); 调用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多