MVC 3 HyphenatedRouteHandler与区域和重复的控制器名称不兼容

时间:2011-07-28 02:43:27

标签: asp.net-mvc-3 asp.net-mvc-areas hyphenation mvcroutehandler

我对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 }
        );
    }
}

1 个答案:

答案 0 :(得分:1)

您需要在HyphenatedRouteHandler中指定区域:

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