【问题标题】:MVC non-area route problems (alongside areas)MVC 非区域路由问题(沿区域)
【发布时间】:2011-09-26 10:37:28
【问题描述】:

应该如何配置以下非区域路由?

/foo/{controller}/{action}/{id}
映射到命名空间 myapp.foo 中的控制器。

/{controller}/{action}/{id}
映射到命名空间 myapp 中的控制器。

我还有2个区域,bar和baz,它们都注册到了registeraAllAreas。

我目前的设置

这是我目前的设置。当我使用 url /Home/Index 时,它会出现以下问题。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("myapp/elmah.axd/{*pathInfo}");

AreaRegistration.RegisterAllAreas();

routes.MapRoute(
    "foo", // Route name
    "foo/{controller}/{action}/{id}", // URL with parameters
    new { action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new string[] { "myapp.Controllers.foo" }
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new string[] { "myapp.Controllers" }
);

找到了与名为“Menu”的控制器匹配的多种类型。这 如果服务此请求的路由可能会发生 ('foo/{controller}/{action}/{id}') 没有指定命名空间 搜索与请求匹配的控制器。

“菜单”的请求找到了以下匹配的控制器: myapp.Controllers.MenuController
myapp.Areas.bar.Controllers.MenuController
myapp.Areas.baz.Controllers.MenuController

显然我做错了什么。

更新

我在使用时也得到了错误的地址:

<% using (Ajax.BeginForm("SaveSomething", "Home", ...

它呈现&lt;form target="/foo/Home/SaveSomething"

我猜想在同一区域的两条路线中无法可靠地使用 {controller}。

更新 2

当我将 /foo 路由注册放在底部时,它似乎工作得更好。
这就提出了一个问题,什么被认为是/默认路由? (因为建议将默认路由放在最后。)

【问题讨论】:

  • 我是否更正了失败的请求是foo/menu,并且foo 命名空间中没有MenuController?
  • @counsellorben 这几乎是正确的。我通过浏览器中的 url 框点击 /Home/Index 。相应的索引视图位于包含以下代码的母版页中:&lt;% Html.RenderAction( "Index", "Menu", new { theController = ViewContext.RouteData.Values["controller"].ToString(), theAction = ViewContext.RouteData.Values["action"].ToString() }); %&gt;。 foo 命名空间中没有菜单控制器。我不明白为什么它匹配那条路线。
  • 母版页是否在 foo 命名空间中?另外,为什么你有标记“theController”和“theAction”?它们在哪里使用?
  • @counsellorben 一个 mvc 母版页没有命名空间 afaik,但它驻留在 /views/shared 中,如果这就是你的意思。标记是动作的参数。顺便说一句,问题已更新。

标签: c# asp.net asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing


【解决方案1】:

您有两个名称为MenuController 的控制器,因此如果您不提供更多信息,MVC 不知道该使用哪一个。在您所在的地区,您可能有一个名为&lt;YourAreaName&gt;AreaRegistration 的文件。打开这些文件并更新 RegisterArea 方法,以便将请求路由到正确的控制器。

从您的错误消息看来,路由似乎被映射到 foo/{controller}/{action}/{id},它没有 MenuController。我的猜测是,您在 foo 某事下的页面上有一个操作链接。如果您不指定链接的区域,则会生成错误的链接。

试试这个使用ActionLink的默认路由:

@Html.ActionLink("Some text", "action", "controller", new { area = "" }, null)

如果您希望请求转到特定区域,只需在通话中写下即可。

更新:问题是当你写像Ajax.BeginForm("SaveSomething", "Home",...) 这样的东西时,它会匹配第一条路线。正如我之前建议的那样,您无法通过将区域放在 BeginForm 语句中来解决此问题,因为 foo 路线不是区域。您有两个选择,1:将 foo 部分移动到一个区域,2:将 foo 路由放在默认路由之后。如果将默认路由放在 foo 路由之前,只要 foo 与默认路由位于同一区域(默认区域),您将很难呈现 url,因为路由引擎总是会首先找到默认路由。但是,您将能够捕获对 foo 路由的请求。所以我最好的建议是将 foo 路线放在一个区域中。

【讨论】:

  • 但它不应该转到默认控制器,因为我不请求区域 url 吗?
  • 你想要到达的路线是什么?你有什么不同版本的MenuController?
  • /Home/Index 在默认路由中。我在默认路由和每个区域都有一个 MenuController。
  • 但是当您遇到问题时,您会尝试走哪条路线?你是什​​么网址?命名空间是否正确?您是否以正确的顺序注册路线?用更多信息更新了我的答案。
  • 我在网络浏览器的地址栏中写 /Home/Index。我已经为各自的区域路由设置添加了命名空间。我将进行更多调整,看看是否有所改善。
猜你喜欢
  • 2011-08-07
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2016-08-05
  • 2013-03-12
相关资源
最近更新 更多