ASP.NET MVC 4的奇怪路由结果



我遇到了一个最奇怪的路由问题,我无法解决如何避免。我们的应用程序中有两个区域,并且这两个区域都有一个Employees控制器。所以我们有两个有效的URL:

blah.com/Employees/Employesblah.com/Reports/Employees

路线注册如下:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Employees_default",
        "Employees/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}
public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Reports_default",
        "Reports/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

现在一切都按预期进行,但如果有人输入了错误的URL,就会出现问题,比如这个:

blah.com/员工

然后生成以下错误:

发现多个类型与名为"Employees"的控制器匹配。如果为该请求提供服务的路由("{controller}/{action}/{id}")没有指定命名空间来搜索与该请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用带有"namespaces"参数的"MapRoute"方法的重载来注册此路由

"雇员"请求已找到以下匹配的控制器:等等。行政区域员工管理员员工管理员等等。区域、报告、控制器、员工控制器

当路线中缺少该区域时,它甚至会尝试匹配这两条路线中的任何一条,这对我来说都没有意义?路线中清楚地包含了区域名称,这不是可选的吗?

我还注意到,如果我有另一条路线的有效控制器,比如这个:

blah.com/Tools/ErrorLog

如果我输入blah.com/ErrorLog,它实际上运行了Tools/ErrorLog控制器,但它在试图查找视图时失败了。你知道上面是什么吗?

您需要在MapRoute方法中使用NameSpaces。

public override void RegisterArea(AreaRegistrationContext context)
{
  context.MapRoute(
    "Employees_default",
    "Employees/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new [] { Mysolution.Myproject.Employees }
  );
}
public override void RegisterArea(AreaRegistrationContext context)
{
  context.MapRoute(
    "Reports_default",
    "Reports/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new [] { Mysolution.Myproject.Reports }
  );
}

最新更新