如何正确使用ASP.NET MVC 4区域的Html.ActionLink

我最近在ASP.NET MVC 4中发现了我已经成功实现的区域,但是我在Razor视图中遇到了@Html.ActionLink助手的麻烦。 这个助手生成的URL似乎总是相对于当前页面的URL。

我在IIS 7(Win7)中将我的网站配置为/Foo的应用程序虚拟目录。

我注册了两个区域:管理员和博客。 我有AdminAreaRegistration.csBlogsAreaRegistration.cs文件中的默认代码。 我将namespaces = new[] { "MvcProject.Controllers" }到默认RouteConfig的默认值中:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new {
                controller = "Home", action = "Index", id = UrlParameter.Optional,
                namespaces = new[] { "MvcProject.Controllers" }
            }
        );
    }
}

当我到我的网站的主页: http://localhost/Foo ,它正确加载了我的网站的“主页”页面。 此时,所有操作链接都有其正确的URL。

来自MvcProject/Views/Shared/_Layout.cshtml示例代码

<h2>Main Navigation</h2>
<ul>
    <li>@Html.ActionLink("Home", "Index", "Home")</li>
    <li>@Html.ActionLink("Blogs", "Index", "Blogs/Home")</li>
    <li>@Html.ActionLink("Admin", "Index", "Admin/Home")</li>
</ul>

这正确地将HTML呈现为:

<h2>Main Navigation</h2>
<ul>
    <li><a href="/Foo">Home</a></li>
    <li><a href="/Foo/Blogs/Home"></li>
    <li><a href="/Foo/Admin/Home"></li>
</ul>

例如,当我在浏览器中导航到“博客”时,该URL将在浏览器中正确加载: /Foo/Blogs/Home

现在,我的主导航栏中的链接将其URL改为:

<h2>Main Navigation</h2>
<ul>
    <li><a href="/Foo/Blogs/Home">Home</a></li>
    <li><a href="/Foo/Blogs/Blogs/Home"></li>
    <li><a href="/Foo/Blogs/Admin/Home"></li>
</ul>

请注意,“Blogs /”附加到IIS虚拟目录名称,以便/Foo/Blogs/Home现在是/Foo/Blogs/Blogs/Home

控制器和视图渲染正常,只是在我的MvcProject/Views/Shared/_Layout.cshtml视图中对@Html.ActionLink的调用没有按预期工作。

这感觉就像我错过了一些微不足道的东西,但没有多少搜索能够找到答案。 我发现在ASP.NET MVC4中实现Areas的每篇博文和教程都没有提及@Html.ActionLink行为的变化。


我讨厌回答我自己的问题,但是@Matt Bodily让我走上了正轨。

@Html.Action方法实际上调用一个控制器并呈现该视图,所以在我的情况下无法创建HTML片段,因为这会导致递归函数调用导致StackOverflowException。 @Url.Action(action, controller, { area = "abc" })确实会返回URL,但我终于发现了Html.ActionLink的重载,为我的情况提供了更好的解决方案:

@Html.ActionLink("Admin", "Index", "Home", new { area = "Admin" }, null)

注意:在这种情况下, null是重要的,以匹配正确的签名。

文档:@ Html.ActionLink(LinkExtensions.ActionLink)

有关此特定超载的文档:

LinkExtensions.ActionLink(控制器,动作,文本,RouteArgs,HtmlAttributes)

很难找到这些助手的文档。 当我可能应该搜索“LinkExtensions.ActionLink”时,我倾向于搜索“Html.ActionLink”,如果这有助于将来任何人。

仍然以马特的回应为答案。

编辑:找到另一个HTML帮手来解决这个问题:

@Html.RouteLink("Admin", new { action = "Index", controller = "Home", area = "Admin" })

我如何重定向到某个区域将其添加为参数

@Html.Action("Action", "Controller", new { area = "AreaName" })

对于我使用的链接的href部分

@Url.Action("Action", "Controller", new { area = "AreaName" })

只是加起来我的一点:
请记住,您需要在MVC应用程序中至少有2个区域才能获得routeValues: { area="" } working; 否则区域值将被用作查询字符串参数,并且链接将如下所示: /?area=

如果您没有至少两个区域,则可以通过以下方法解决此问题:
1.在RouteConfig.cs编辑默认路由,如下所示:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

要么
2.为您的MVC项目添加一个虚拟区域。

链接地址: http://www.djcxy.com/p/80091.html

上一篇: How to correctly use Html.ActionLink with ASP.NET MVC 4 Areas

下一篇: Force all Areas to use same Layout