【问题标题】:MVC Route WeirdnessMVC 路由怪异
【发布时间】:2011-02-19 02:08:35
【问题描述】:

大家好,全新的 asp.net mvc,我正在通过构建股票 mvc 模板创建一个虚假的社交网站(用于学习目的)......我添加了一些视图等,一切都很好。但是,现在我添加了一个名为“博客”的 mvc 区域,并将链接添加到主菜单。现在,如果我单击任何菜单项,一切都会按预期工作 - 但是当我单击“博客”菜单项时,视图等会显示博客页面,但是其他视图的菜单链接前面有 /Blog/现在的网址!?不确定我是否做错了什么......这是我的菜单代码:

<div id="menucontainer">
                <ul id="menu">
                    @* @Html.ActionLink() Params = String Name, String Controller Name,
                    string Method (actionLink) Name *@
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("Mail", "Index", "Mail")</li>
                    <li>@Html.ActionLink("Search", "Index", "Search")</li>
                    <li>@Html.ActionLink("Dating", "Index", "Dating")</li>
                    <li>@Html.ActionLink("Groups", "Index", "Groups")</li>
                    <li>@Html.ActionLink("Forums", "Index", "Board")</li>
                    <li>@Html.ActionLink("Blog", "Index", "Blog")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                </ul>
            </div>

【问题讨论】:

  • @BJSafdie:我认为这个问题清楚地提到了领域
  • 呃,是的。抱歉,小写字母让我失望了。

标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas


【解决方案1】:

如果博客与其他博客位于不同的区域中,MVC 期望来自该区域的链接位于同一区域内,因此它将区域附加到您的 URL。如果它们位于不同的区域,则需要使用“区域”路由值调用 ActionLink。例如,如果“约会”在“社交”区域,您可以使用:

@Html.ActionLink("Dating", "Index", new { controller = "Dating", area = "Social" } );

这里是来自What’s New in ASP.NET MVC 2的相关讨论:

“区域”现在是保留的路由值键

现在路由值中的字符串“area” 在 ASP.NET MVC 中具有特殊含义,在 与“控制器”和 “行动”做。一个暗示是 如果 HTML 助手提供了一个 路由值字典包含 “区域”,帮手将不再 在查询字符串中附加“区域”。

如果您使用的是区域功能, 确保不要使用 {area} 作为 您的路线网址。

【讨论】:

  • 使用这个概念为您最常用的 ActionLink 的化身制作 HtmlHelper 的扩展方法。它会在以后为您节省大量击键和挫败感。
  • @Chad,不完全确定您的意思是什么?我已经阅读了一些有关 HtmlHelpers 的信息,但不确定这对控制器的 ActionLink 部分有何帮助?
  • 谢谢一吨 BJ!让一切都运行起来,有点令人困惑 - 从我的谷歌搜索中从来没有准备好任何东西......很高兴我发布了。唯一的问题是……我该将答案授予谁!?我应该发布另一个关于它的问题!?大声笑
【解决方案2】:

它从当前上下文中获取未定义的值。例如@Html.ActionLink("Test", "Test") 将创建相对于控制器的链接。因此,例如,如果您将在 Foo 控制器上渲染它,它将渲染元素 &lt;a href="/Foo/Test"&gt;Test&lt;/a&gt;。区域也是如此 - 如果您想要跨区域的静态链接,您将必须定义它应该引导您到哪个区域。示例:@Html.ActionLink("Test", "Test", "Foo", new { @area = string.Empty }, null) 将始终链接到控制器 Foo 操作 Test,没有区域。

【讨论】:

  • 感谢您的回答,在 BJ 建议如何设置公式的其余部分后,您给出了我无法弄清楚的部分公式...空 @area 等于我的主页或默认路线认为。谢谢各位,解惑了!会在这个问题上停留一段时间......正在考虑像url重写这样的路线......
猜你喜欢
  • 2013-08-15
  • 2013-11-14
  • 1970-01-01
  • 2017-09-01
  • 2016-09-25
  • 2012-10-06
  • 2016-11-28
  • 2013-11-09
  • 1970-01-01
相关资源
最近更新 更多