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个参数