我对MVC3很新,但我花了不少时间研究这个并进行测试,但我找不到解决方案。 Stack上还有另一个类似的帖子,但是7个月后它没有得到答复。
关键在于:如果您的区域和控制器名称重复 - 没问题。如果你有区域并使用HyphenatedRouteHandler - 没问题。如果您尝试使用区域,重复控制器名称和带连字符的路由处理程序,则会收到错误:
发现多个类型与名为“products”的控制器匹配。 如果为此请求提供服务的路由,则会发生这种情况 ('{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 }
);
}
}
答案 0 :(得分:1)
您需要在HyphenatedRouteHandler中指定区域:
requestContext.RouteData.DataTokens["area"] = requestContext.RouteData.Values["area"].ToString().Replace('-', '_');