【发布时间】:2014-10-09 13:17:43
【问题描述】:
我的 ASP .NET MVC 5 项目目前有 2 个区域。一种叫做Supporters,一种叫做Chatter。在这两个区域中的每一个区域中,都有一个名为 CommunicationController 的 ApiController,由于 ApiController 如何与路由一起使用的性质,这会带来问题。
问题的一个例子
如果我在一个区域中只有一个名为CommunicationController 的ApiController,它的路由不会在 URL 中包含该区域,并且 URL 会是这样的:
http://example.com/api/communication/someAction
但是在上面的网址中,区域在哪里?
由于我的两个控制器名称相同,因此它们现在都存在路由问题。
我尝试了什么?
我尝试按照此处的说明进行操作:http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/
他们似乎申请了 ASP .NET MVC 4 RC,因为我使用的是 MVC 5,所以它不再相关,这可能就是它不起作用的原因。
不过,回顾那篇博文,这里是我的路由文件。
App_Start\RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", "{controller}/{action}",
new {action = "Index", controller = "Home"},
new[] { "Website.Controllers" }
);
}
}
App_Start\WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
//the two lines below were added.
config.Routes.MapHttpRoute("SupportersApi", "api/supporters/{controller}/{id}", new {id = RouteParameter.Optional, area = "Supporters"}
);
config.Routes.MapHttpRoute("ChatterApi", "api/chatter/{controller}/{id}", new { id = RouteParameter.Optional, area = "Chatter" }
);
}
}
Areas\Chatter\ChatterAreaRegistration.cs
public class ChatterAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Chatter"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
//the below line was added.
context.Routes.MapHttpRoute("Chatter_api", "api/chatter/{controller}/{id}", new { id = RouteParameter.Optional, area = "Chatter" }
);
context.MapRoute(
"Chatter_default",
"Chatter/{controller}/{action}/{id}",
new {action = "Index", id = UrlParameter.Optional}
);
}
}
Areas\Supporters\SupportersAreaRegistration.cs
public class SupportersAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Supporters";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
//the below line was added.
context.Routes.MapHttpRoute("Supporters_api", "api/supporters/{controller}/{id}", new { id = RouteParameter.Optional, area = "Supporters" }
);
context.MapRoute(
"Supporters_default",
"Supporters/{controller}/{action}/{id}",
new { action = "Index", controller = "Home", id = UrlParameter.Optional }
);
}
}
我在这里做错了什么,我有什么选择?
【问题讨论】:
-
别忘了您可以使用Glimpse 调试您的路线。它将为您提供有价值的信息,说明您的路线为何未按预期运行。
-
一瞥对我没有帮助。它只是在我加载页面时崩溃。
-
这可能不是你想听到的,但我个人永远不会使用区域。这不值得努力。如果我想使用“区域”,我将根据需要设置我想要的文件夹结构和相关的 Views/Web.configs。我发现太多东西只是与区域摩擦,而使用本机 MVC 并使用它会更好。我曾经领导过的最好的项目之一(使用你的术语)我有
/Modules/Chatter和/Modules/Supporters嵌套了 Controllers/Views 文件夹。我只需要花费public ActionResult foo() { return View("~/modules/chatter/foo.cshtml") }
标签: c# asp.net-mvc