1

我对 MVC3 还很陌生,但是我花了很多时间研究和测试,但我找不到解决方案。Stack 上还有另一个类似的帖子,但 7 个月后仍未得到答复。

症结在于:如果您有重复名称的区域和控制器 - 没问题。如果您有区域并使用 HyphenatedRouteHandler - 没问题。如果您尝试使用区域、重复的控制器名称和带连字符的路由处理程序,则会收到错误消息:

找到了与名为“产品”的控制器匹配的多种类型。如果服务此请求的路由 ('{controller}/{action}/{id}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用采用“namespaces”参数的“MapRoute”方法的重载来注册此路由。

我还应该补充一点,我在根控制器上收到错误,但不是该区域内的控制器。例如,/products 不起作用,但 /admin/products 起作用。

我将永远感激一个具体的解决方案!代码如下所示:

全球.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 }
        );
    }
}
4

1 回答 1

1

您需要在 HyphenatedRouteHandler 中指定区域:

requestContext.RouteData.DataTokens["area"] = requestContext.RouteData.Values["area"].ToString().Replace('-', '_');

于 2011-08-05T20:45:37.460 回答