如何正确使用ASP.NET MVC 4区域的Html.ActionLink
我最近在ASP.NET MVC 4中发现了我已经成功实现的区域,但是我在Razor视图中遇到了@Html.ActionLink
助手的麻烦。 这个助手生成的URL似乎总是相对于当前页面的URL。
我在IIS 7(Win7)中将我的网站配置为/Foo
的应用程序虚拟目录。
我注册了两个区域:管理员和博客。 我有AdminAreaRegistration.cs
和BlogsAreaRegistration.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项目添加一个虚拟区域。
上一篇: How to correctly use Html.ActionLink with ASP.NET MVC 4 Areas