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.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" }
}
);
}
}
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.ActionLink
我MvcProject/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)
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)
归档时间: |
|
查看次数: |
245976 次 |
最近记录: |