使用ASP.NET站点地图提供程序时如何解决多个控制器错误

时间:2012-09-28 10:40:21

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-routing

我正在使用ASP.NET MVC3和ASP.NET MVC Sitemap Provider

我有一个名为Application的控制器。我还有一个名为Administration的区域。在管理区域,我还有一个名为Application的控制器。

第一个应用程序控制器适用于普通网站用户。另一个应用程序控制器适用于管理员。

我希望我的网址显示为:

/Application/1001/Notes
/Administration/Application/1001/Notes

我对上述2个网址的路由注册是这样的:

Routes.MapRoute("ApplicationNote",
     "{controller}/{applicationId}/Notes",
     new { controller = "Application", action = "Notes" },
     new { applicationId = @"\d+" },
     new[] { "MyProject.Web.Controllers" });

Routes.MapRoute("AdminApplicationNote",
     "{area}/{controller}/{applicationId}/Notes",
     new { area = "Administration", controller = "Application", action = "Notes" },
     new { applicationId = @"\d+" },
     new[] { "MyProject.Web.Areas.Administration.Controllers" });

当我运行我的应用程序并转到应用程序控制器中的任何操作方法时,我在这里收到错误:

@Html.MvcSiteMap().SiteMapPath()

错误是:

Found multiple controllers:Application

以下是我的站点地图配置的部分视图:

 <mvcSiteMapNode title="About" area="" controller="Home" action="About" />

 <mvcSiteMapNode title="Applications" area="" controller="Application" action="Index" key="ApplicationIndex">
      <mvcSiteMapNode title="Create Application" area="" controller="Application" action="Create" />
      <mvcSiteMapNode title="Applications List" controller="Application" area="" action="List" />
 </mvcSiteMapNode>

 <mvcSiteMapNode title="Administration Dashboard" area="Administration" controller="Dashboard" action="Index">
      <mvcSiteMapNode title="Users Dashboard" area="Administration" controller="User" action="List" />
 </mvcSiteMapNode>

我该如何解决这个问题?如果我删除名为AdminApplicationNote的路由,则其他应用程序URL会正确显示。但是我可以让第二条区域路线按预期工作。

1 个答案:

答案 0 :(得分:0)

什么版本的提供商?

一般来说,路线看起来不错。我之前遇到过这样的问题(在更复杂的情况下)和SiteMap使用的命名空间解析(它应该作为路由的名称空间,表明控制器是不同的)。

我建议您从github获取MvcSiteMapProvider.DefaultControllerTypeResolver的代码。认为它在第285行抛出与使用命名空间定位控制器有关的异常。使用source来实现你自己的版本(如果你已经使用它,当然可以直接进入他们的代码)然后使用你的版本断点并介入并确定它为什么声称它们是重复的。您需要在Web.config中注册您的实现。例如

之类的东西
controllerTypeResolver="MyProject.Web.YourControllerTypeResolver, MyProject" 

在创建多租户应用程序时,我必须这样做,租户有不同的控制器,我必须提供替代解决方案策略。

一般来说,你需要空区域(我从不这样做)。通常,您还需要在子节点等中指定控制器,就好像您不是,我确定它使用父节点。

---更新 -

我认为这可能是一个错误。看看https://github.com/maartenba/MvcSiteMapProvider/issues/78

应在3.3.4.0中修复