0

MvcSiteMapProviderプロジェクトに問題があります。サイトマップが常に空です。

Mvc.sitemap設定し、web.configエントリを設定しました。をデバッグするDefaultSiteMapProviderと、.sitemapファイルが読み取られて正しく処理されていることがわかります。ただし、返されるサイトマップは基本的に空です。

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>
            http://localhost:59933/
        </loc>
    </url>
</urlset>

ただし、コードをステップ実行すると、奇妙なことが起こります。DefaultSiteMapProviderをステップスルーし、root変数のルートノードを監視します。メソッドの終わり近くで、を設定すると、ルートノードは空のノードにリセットされますisBuildingSiteMap = false。これがルートノードの設定にどのように影響するかはわかりませんが、プロジェクトでは一貫して発生します。

rootノードが上書きされないようにする方法についてのヘルプをいただければ幸いです。:)


メソッドの最後の方にあるDefaultSiteMapProviderからの注釈付きの抜粋BuildSiteMap(ll。660以降):

HttpContext.Current.Cache.Add(/*...*/); // At this point the root node is correct
isBuildingSiteMap = false; // after executing this line, `root` gets reset to an empty node.
siteMapXml = null;

Mvc.sitemap:

<mvcSiteMap [...]>
  <mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Test" controller="Listing" action="Index">
  </mvcSiteMapNode>
</mvcSiteMap>

エントリはドキュメントページweb.configから直接取得され、サイトマップ名に合わせて調整されます。

4

1 に答える 1

0

私が犯した間違いは、ControllerBuilderにDefaultNamespacesを追加することに関連しています。破線は次のとおりです。

ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web");

そして、すべきだった:

ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web.Controllers");

MVCはこれについて文句を言うことはなく、私のコントローラーを喜んで見つけました。

ただし、サイトマップの構築が完了すると、IsAccessibleForUser()が突然ChildNodesを決定する要因になった場合に限り、DefaultSiteMapProviderの動作は異なります。デフォルトのプロバイダーは、ノードのコントローラーが検出され、サブ名前空間を検索しないかどうかを確認します(名前空間がで終わる場合を除く.*MvcSiteMapProvider.DefaultControllerTypeResolver.IsNamespaceMatch(string requestedNamespace, string targetNamespace)

ワイルドカードを使用しなかったが、MVCが機能するときにサイトマップが機能すると想定したため、後部で噛み付いた。

于 2013-03-04T17:32:47.007 に答える