我在注册路线中添加了新路线。
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 }
);
现在我尝试访问以下网址,我收到以下异常。 本地主机:53643 /帐户/ LogOn支持
异常: System.Web.HttpException(0x80004005):未找到路径'/ Account / LogOn'的控制器或未实现IController。 在System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,Type controllerType) 在System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,String controllerName) 在System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController& controller,IControllerFactory& factory) 在System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback回调,对象状态) 在System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,AsyncCallback回调,对象状态) 在System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData) 在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)}
请帮我解决这个问题。
先谢谢。
答案 0 :(得分:0)
问题在于您已经声明了两个匹配的路由,因此.NET路由无法区分它们。当您导航到/Account/Logon
时,它与DefaultWithTenantCode
路由匹配,而不是Default
路由与以下路由值匹配。
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 }
);
匹配/tenant-code-21/Tenant/Index/
路线时,我们需要DefaultWithTenantCode
这样的网址。如果它不是以租户代码开头,则会使用Default
路由。
另一种选择是在传递租户代码时提供所需的所有参数。
routes.MapRoute(
name: "DefaultWithTenantCode",
url: "{tenantcode}/{controller}/{action}/{id}"
);
这意味着除非明确传递所有4个参数,否则它将永远不会与DefaultWithTenantCode
路由匹配。