【问题标题】:ASP.NET MVC 4 - 2 Areas With Segments, 1 Area WithoutASP.NET MVC 4 - 2 个带段的区域,1 个没有段的区域
【发布时间】:2012-04-16 10:47:10
【问题描述】:

我刚刚创建了一个全新的 ASP.NET MVC 4 解决方案,并添加了 3 个 Areas 并希望它们按照指示进行路由:

1. General         -> http://www.mysite.com/
2. Members         -> http://www.mysite.com/members/
3. Administration  -> http://www.mysite.com/administration/

我可以配置路由,以便“常规”区域在它是第一个段时工作,但当我不希望“常规”作为段显示在网址。如您所见,我的目标是干净的 URL 结构。

我计划在每个区域下添加一些控制器/视图,并希望保持这种区域组织。

我见过similar MVC 2 problem posted,但不确定区域注册的顺序是否能解决我的特定问题。

【问题讨论】:

  • “General”真的需要是一个区域吗?看起来这应该是您网站的大部分内容(而不是在任何区域),然后“成员”和“管理”是两个区域。
  • 嗨,伊桑。有该选项,但理想情况下,我希望将所有控制器/视图保留在一个区域内,因为“常规”区域会随着时间的推移变得非常大。
  • 或者添加到命名空间中的区域。试试这样:context.MapRoute( name: "Dashboard_Site", url: "Dashboard/{controller}/{action}/{id}", defaults: new { area = "Dashboard", controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new {"WebSite.Areas.Dashboard.Controllers"});

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


【解决方案1】:

打开您的 GeneralAreaRegistration.cs 文件。

找到这个:

context.MapRoute(
    "General_default",
    "General/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
);

...并替换为:

context.MapRoute(null,
    "{controller}/{action}/{id}",
    new { controller = "General", action = "Index", id = UrlParameter.Optional }
);

回复 cmets:

假设您使用的是 URL http://www.mysite.com/members,并假设它在您的 MembersAreaRegistration.cs 文件中:

context.MapRoute(
    "Members_default",
    "Members/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

...那么它应该可以工作。但是,如果您的 MapRoute 默认值中没有 controller = "Home" 片段,则 URL 必须是 http://www.mysite.com/members/home

【讨论】:

  • 这当然解决了 URL 问题(谢谢),但是我在“成员”区域中的非常简单的 HomeController 现在返回 404。默认的.MapRoute() 调用是否需要进行一些调整?
  • 你好。这与我的代码中的完全一样,所以没有任何变化,因为 404 仍然出现。我应该在 Global.asax 的 General 区域之前手动注册 Members 区域吗?
  • @Bern 不,我不这么认为。所有区域都应通过 global.asax 中的AreaRegistration.RegisterAllAreas() 行进行注册。您没有更改任何区域名称空间,是吗?如果您返回到 General 区域的原始 MapRoute,404 问题会消失吗?
  • 感谢您的帮助@danludwig,我今天终于明白了。在 VS2010 使用 .NET 4 中,我可以使用您的代码解决问题。在 VS2011 Beta using .NET 4.5 中,我必须做两件事 (1) 在 Global.asax 中手动注册每个区域并确保最后注册“常规”区域 -默认情况下,它按字母顺序注册区域(问题)。如果我创建了一个名为“Aardvark”的区域,那很好,并且(2) 将命名空间显式添加到 MapRoute() 调用中。很抱歉没有早点说明我原来的 IDE 和框架版本,感谢您的帮助。
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
相关资源
最近更新 更多