0

ASP.NET MVC3 とASP.NET MVC Sitemap Providerを使用しています。

アプリケーションという名前のコントローラーがあります。また、アドミニストレーションと呼ばれるエリアもあります。管理領域には、Application というコントローラーもあります。

最初のアプリケーション コントローラーは、通常の Web サイト ユーザー用です。もう 1 つのアプリケーション コントローラーは、管理者向けです。

URL を次のように表示したい:

/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 が正しく表示されます。しかし、その後、2 番目のエリア ルートを意図したとおりに動作させることができます。

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 に答える