【问题标题】:MVC 3 HyphenatedRouteHandler not compatible with Areas and duplicate controller namesMVC 3 HyphenatedRouteHandler 与区域和重复的控制器名称不兼容
【发布时间】: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


【解决方案1】:

您需要在 HyphenatedRouteHandler 中指定区域:

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

【讨论】:

  • 感谢您的回复!我没有机会测试它,因为我基本上不得不解决它。一旦我完成了我的项目,我会回过头来测试它,但我会暂时将其标记为答案,因为它看起来正确。
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2012-08-21
  • 2011-05-25
相关资源
最近更新 更多