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

Gre*_*rdt 40 c# asp.net-mvc-routing razor asp.net-mvc-4

我最近在ASP.NET MVC 4中发现了我已经成功实现的区域,但是我@Html.ActionLink在Razor视图中遇到了帮助器的问题.此助手生成的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" }
            }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

当我转到我的网站的主页:时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>
Run Code Online (Sandbox Code Playgroud)

这正确地将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>
Run Code Online (Sandbox Code Playgroud)

例如,当我在浏览器中导航到"博客"时,此URL正确加载到浏览器中:/Foo/Blogs/Home.

现在,我主导航中的链接将其网址更改为:

<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>
Run Code Online (Sandbox Code Playgroud)

请注意,"Blogs /"会附加到IIS虚拟目录名称,/Foo/Blogs/Home现在就是这样/Foo/Blogs/Blogs/Home.

控制器和视图渲染得很好,只是@Html.ActionLinkMvcProject/Views/Shared/_Layout.cshtml视图中的调用没有按预期工作.

感觉我错过了一些微不足道的事情,但没有多少搜索得出答案.我发现在ASP.NET MVC4中实现区域的每篇博文和教程都没有提到@Html.ActionLink行为方式的变化.

Gre*_*rdt 72

我讨厌回答我自己的问题,但是@Matt身体让我走上正轨.

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

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

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

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

此特定过载的文档:

LinkExtensions.ActionLink(Controller,Action,Text,RouteArgs,HtmlAttributes)

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

仍然将Matt的回答标记为答案.

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

@Html.RouteLink("Admin", new { action = "Index", controller = "Home", area = "Admin" })
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,回答你自己的问题仍然是一件好事!它允许像我这样的人出现并找到我可能遇到的问题/问题的答案.谢谢! (25认同)

Mat*_*ily 16

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

@Html.Action("Action", "Controller", new { area = "AreaName" })
Run Code Online (Sandbox Code Playgroud)

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

@Url.Action("Action", "Controller", new { area = "AreaName" })
Run Code Online (Sandbox Code Playgroud)

  • 在做了一点阅读后,好像`@ Html.Action(...)`实际上调用并呈现动作.在我的情况下,我只是想吐出一个URL.我认为我的堆栈溢出是因为主布局文件呈现了Blogs/Home操作,它会拉入布局文件,这会呈现Blogs/Home操作,它会拉入主布局文件,而...我们去无限. (2认同)