gpt4 book ai didi

c# - 如何在 ASP.NET MVC 4 区域中正确使用 Html.ActionLink

转载 作者:IT王子 更新时间:2023-10-29 03:56:07 26 4
gpt4 key购买 nike

我最近发现了Areas in ASP.NET MVC 4 ,我已经成功实现了,但是我在 Razor View 中遇到了 @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 .

Controller 和 View 呈现良好,只是在我的 MvcProject/Views/Shared/_Layout.cshtml View 中对 @Html.ActionLink 的调用没有正常工作我预料到了。

感觉好像遗漏了一些微不足道的东西,但没有找到答案。我找到的关于在 ASP.NET MVC4 中实现 Areas 的每篇博文和教程都没有提及 @Html.ActionLink 行为方式的变化。

最佳答案

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

@Html.Action 方法实际上调用 Controller 并呈现 View ,因此在我的情况下创建 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(Controller, Action, Text, RouteArgs, HtmlAttributes)

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

仍然将 Matt 的回复标记为答案。

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

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

关于c# - 如何在 ASP.NET MVC 4 区域中正确使用 Html.ActionLink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22407594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com