0

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

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

第一个应用程序控制器是针对普通网站用户的。另一个应用程序控制器供管理员使用。

我希望我的网址显示为:

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

我对上述 2 个 URL 的路由注册如下:

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 将正确显示。但随后我可以让第二条区域路线按预期工作。

4

1 回答 1

0

什么版本的提供者?

路线看起来一般。我之前遇到过这样的问题(在一个更复杂的场景中)并且 SiteMap 使用了命名空间解析(它应该可以工作,因为你的路由命名空间表明控制器是不同的)。

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

controllerTypeResolver="MyProject.Web.YourControllerTypeResolver, MyProject" 

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

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

- -更新 -

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

应该在 3.3.4.0 中修复

于 2012-09-28T23:16:46.607 回答