OK - PortalSiteMapProviderを継承するカスタム ナビゲーション プロバイダーを作成し、GetChildNodes メソッドを使用してクラスを拡張しようとしています (簡単な例はこちら)。
基本的に私がやろうとしているのは、現在の SPWeb の SiteLogoUrl 文字列を各 SPWeb のそれぞれの SiteMapNode の属性 (imgurl と呼ばれる) として追加し、後でカスタム メニュー コントロール (SharePoint:AspMenu を継承する) でこの値を取得するビューを追加することです。
GetChildNodes の下のプロバイダーで次のように属性を設定しています。
public override SiteMapNodeCollection GetChildNodes(SiteMapNode node)
{
PortalSiteMapNode portalNode = (PortalSiteMapNode)node;
if (portalNode != null)
{
if (portalNode.Type == NodeTypes.Area)
{
SiteMapNodeCollection nodeColl = base.GetChildNodes(portalNode);
using (SPSite currentSite = new SPSite(portalNode.PortalProvider.CurrentSite.Url))
{
foreach (SiteMapNode topLevelNode in nodeColl)
{
foreach(SiteMapNode currentNode in topLevelNode.ChildNodes)
{
string currentWebUrl = currentNode.Url.Substring(0, currentNode.Url.ToLower().IndexOf("/pages/"));
using (SPWeb currentWeb = currentSite.OpenWeb(currentWebUrl))
{
if (!string.IsNullOrEmpty(currentWeb.SiteLogoUrl))
{
currentNode["imgurl"] = currentWeb.SiteLogoUrl;
}
}
}
}
}
return nodeColl;
}
これで、これをデバッグして、挿入された値を取得できます (x はノードのインデックスで、コマンド ウィンドウでこれを実行しています)。
? topLevelNode.ChildNodes[x]["imgurl"]
そして、それは画像のURLを返します: "/_layouts/images/myimage.jpg"
今.. カスタム メニュー コントロールでこれを実行しようとすると、最初に次のようにカスタム ナビゲーション プロバイダーのハンドルを取得します。
CustomNavProvider customProvider = (CustomNavProvider)SiteMap.Providers["CustomNavProvider"];
SiteMapNode currentNode = customProvider.FindSiteMapNode(childitem.NavigateUrl);
currentNode 変数には SiteMapNode が含まれるようになりました...すばらしいですが、以前に追加した属性の代わりに、「AlternateUrl」という属性が 1 つだけになりました。プロバイダーに追加した imgurl 属性は消えています。title、desc などの他のすべてのプロパティが存在するため、正しいノードが確実に返されます。
ここで私の問題は何ですか?属性をプロバイダーのノードに追加したときに、属性が保持されていませんか?
ヘルプや提案をいただければ幸いです。