添加新路线时出现异常

时间:2014-11-05 06:19:10

标签: 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.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)}

请帮我解决这个问题。

先谢谢。

1 个答案:

答案 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路由匹配。