0

DB から基本ノードをロードするブレッドクラムがあります (thx から nightowl に助けてもらいましょう!)。この機能を実現するために、「ISiteMapNodeProvider」を実装する「CustomSiteMapNodeProvider」を実装しました。ブレッドクラムは、DB からのノードに対して機能するようになりました。ここで、DB から取得したいくつかのノードの子として動的ノードを追加したいと考えました。私の最初の衝動は、MvcSiteMapNodeAttribute を使用することでした。

[MvcSiteMapNodeAttribute(Title = "Execute", Area = "MyArea", DynamicNodeProvider = "My.Namespace.MyDynamicNodeProvider, My.Assembly", Clickable = false, ParentKey="KeyOfParentDbNode")]
public ActionResult Execute(Guid id, MyViewModel vm){
      return View(vm)
}

しかし、これは機能しませんでした。「MyDynamicNodeProvider」内のブレークポイントが起動時にヒットしましたが、「実行」メソッドを呼び出すとブレッドクラムが表示されません。

私の DynamicNodeProvider は次のようになります。

public class ProfileDynamicNodeProvider
    : DynamicNodeProviderBase
    {
        public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
        {
            ProfileDao dao = DependencyResolver.Current.GetService<ProfileDao>();

            // Create a node for each element 
            foreach (Profile profile in dao.GetAll())
            {
                DynamicNode dynamicNode = new DynamicNode
                {
                    Title = profile.Name,
                    //Key = "Profile_"+profile.IdProfile,
                    ParentKey = "KeyOfParentNode",
                };
                dynamicNode.RouteValues.Add("id", profile.IdProfile);

                yield return dynamicNode;
            }
        }

    }

この作業を行うにはどうすればよいですか?

編集: 間違った順序で処理されている可能性がありますか? CustomSiteMapNodeProvider のブレークポイントに到達する前に、DynamicNodeProvider のブレークポイントに到達します。

4

1 に答える 1

1

DynamicNode が宣言されているノードは、単なるテンプレート ノードです。そのノードは SiteMap に追加されません。さらに、プロバイダー内の DynamicNode オブジェクトに設定したプロパティは、テンプレート ノードで定義したものを上書きします。

あなたの例では、「KeyOfParentDbNode」値はすべての場合に値「KeyOfParentNode」によって上書きされ、問題の原因となる可能性があります。また、キー プロパティを明示的に "KeyOfParentNode" に設定するノードがどこかにあることを確認してください (つまり、"KeyOfParentNode" を設定しようとしている場合)。

さらに、すべての DynamicNode の Clickable プロパティが false に設定されます。

4.3.0 以降を使用している場合、SiteMapBuilder が SiteMap にノードを追加する前に SiteMapNodeProviders がすべてのノードをインスタンス化するため、その時点ですべての親ノードがすべて使用可能になるため、順序は重要ではありません。

@Html.MvcSiteMap().SiteMap()HTML ヘルパーを使用してノードを表示し、ノードが正しくネストされているかどうかを確認すると役立つことがよくあります。コントローラーとアクション(およびその他の)プロパティが正しく設定されているかどうかを確認するために呼び出しMvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("TheDynamicNodeKey")て確認することもできます(ただし、例では問題ないはずです)。

発生している可能性のある別の問題は、MvcSiteMapProvider が比較を行うときに文字列を使用し、「id」を Guid に設定していることです。

// You have
dynamicNode.RouteValues.Add("id", profile.IdProfile);

// Should be
dynamicNode.RouteValues.Add("id", profile.IdProfile.ToString());
于 2013-11-14T01:15:38.970 に答える