Asp.net mvc 4 添加新路由时发生异常

Asp.net mvc 4 添加新路由时发生异常,asp.net-mvc-4,asp.net-mvc-routing,Asp.net Mvc 4,Asp.net Mvc Routing,我在注册路线中添加了新路线 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{resource}.wdgt/{*pathInfo}"); routes.IgnoreRoute("ChartImg.axd/{*pathInfo}"); routes.Ignore("{*pathInfo}", new { pathInfo = @"^.*(ChartImg.axd)$" }); routes.IgnoreRo

我在注册路线中添加了新路线

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.wdgt/{*pathInfo}");
routes.IgnoreRoute("ChartImg.axd/{*pathInfo}");
routes.Ignore("{*pathInfo}", new { pathInfo = @"^.*(ChartImg.axd)$" });
routes.IgnoreRoute("{resource}.svc");

routes.MapRoute(
   name: "DefaultWithTenantCode",
   url: "{tenantcode}/{controller}/{action}/{id}",
   defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, tenantcode = UrlParameter.Optional }
            );

routes.MapRoute(
   name: "Default",
   url: "{controller}/{action}/{id}",
   defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
   );
现在我试图访问下面的url,我得到以下异常。 本地主机:53643/帐户/登录

例外情况: System.Web.HttpException 0x80004005:未找到路径“/Account/LogOn”的控制器或未实现IController。 在System.Web.Mvc.DefaultControllerFactory.GetControllerInstanceRequestContext请求上下文中,键入controllerType 在System.Web.Mvc.DefaultControllerFactory.CreateControllerRequestContext requestContext中,字符串controllerName 位于System.Web.Mvc.MvcHandler.ProcessRequestInitHttpContextBase httpContext、IController和controller、IControllerFactory和factory 位于System.Web.Mvc.MvcHandler.BeginProcessRequestHttpContextBase httpContext,异步回调,对象状态 位于System.Web.Mvc.MvcHandler.BeginProcessRequestHttpContext httpContext,异步回调,对象状态 在System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.BeginProcessRequestHttpContext上下文中,异步回调cb,对象外部数据 在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute 在System.Web.HttpApplication.executesteppexecutionstep步骤中,布尔值&completedSynchronously}

请帮我解决这个问题


提前感谢。

问题是您已经声明了两个都匹配的路由,因此.NET路由无法区分它们之间的差异。当您导航到/Account/Logon时,它会将DefaultWithTenantCode路由而不是默认路由与以下路由值匹配

tenantCode = "Account"
controller = "LogOn"
action = "Index"
id = ""
摆脱这种情况的一种方法是向路由中添加某种标识符,以便它知道您何时传递租户代码

routes.MapRoute(
    name: "DefaultWithTenantCode",
    url: "tenant-code-{tenantcode}/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, tenantcode = UrlParameter.Optional }
        );
routes.MapRoute(
    name: "DefaultWithTenantCode",
    url: "{tenantcode}/{controller}/{action}/{id}"
        );
当匹配DefaultWithTenantCode路由时,这将需要像/tenant-code-21/tenant/Index/这样的URL。如果它不是以租户代码开头,它将使用默认路由

另一个选项是在传递租户代码时设置所有必需的参数

routes.MapRoute(
    name: "DefaultWithTenantCode",
    url: "tenant-code-{tenantcode}/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, tenantcode = UrlParameter.Optional }
        );
routes.MapRoute(
    name: "DefaultWithTenantCode",
    url: "{tenantcode}/{controller}/{action}/{id}"
        );
这意味着它永远不会匹配DefaultWithTenantCode路由,除非显式传递所有4个参数