【发布时间】:2011-07-28 02:43:26
【问题描述】:
我对 MVC3 还很陌生,但我花了很多时间研究和测试,但我找不到解决方案。 Stack 上还有另一个类似的帖子,但 7 个月后仍未得到答复。
关键是:如果您有重复名称的区域和控制器 - 没问题。如果您有区域并使用 HyphenatedRouteHandler - 没问题。如果您尝试使用区域、重复的控制器名称和带连字符的路由处理程序,则会收到错误消息:
找到了与名为“产品”的控制器匹配的多种类型。 如果服务此请求的路由会发生这种情况 ('{controller}/{action}/{id}') 未指定要搜索的命名空间 对于与请求匹配的控制器。如果是这种情况, 通过调用“MapRoute”方法的重载来注册此路由 这需要一个“命名空间”参数。
我还应该补充一点,我在根控制器上收到错误,但不是该区域内的控制器。例如,/products 不起作用,但 /admin/products 起作用。
我将永远感激一个具体的解决方案!代码如下所示:
Global.asax
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var route = routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "MyProject.Controllers" }
);
route.RouteHandler = new HyphenatedRouteHandler();
}
还有:
public class HyphenatedRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
AdminAreaRegistration.cs
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
【问题讨论】:
-
在您所在地区的路线中,您是否尝试过添加该地区的命名空间,就像您在 Global.asax.cs 中的默认路线一样?
-
我加了,现在看起来像
-
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { controller = "Home", action = "索引", id = UrlParameter.Optional }, new[] { "MyProject.Areas.Admin.Controllers" } ); } 但没有运气 - 当我点击根 /products 页面时,我仍然遇到同样的错误。
标签: asp.net-mvc-3 asp.net-mvc-areas hyphenation mvcroutehandler