3

LINQTOSQL を利用した動的日付フレームワークのブレッドクラムを動的に生成する動的ブレッドクラム コントロールを作成する方法について、いくつかの例またはアイデアが必要です

4

2 に答える 2

1

おそらく次の 3 つが必要です。

  1. データベースの階層構造*
  2. 階層を読み取るためのStaticSiteMapProviderに基づくカスタム SiteMap プロバイダー
  3. ブレッドクラムを表示するSiteMapPathコントロール。

* クライアント サイトに似たようなものを求めたときにいくつか探し回った結果、パス構造をデータベースに保存するのが最も簡単であると判断しました。任意の深さのサイト マップについては、以前にここで回答を示しました。 SQL2008 を使用している場合は、新しいHierarchyIdデータ型を使用してこれを少し簡単にすることができます。

そうは言っても、カテゴリや製品のようなものがある場合は、おそらくデータベース内のより単純なシステムで問題を解決できます.

これを解決するために作成する必要があった主な機能は、次のようなものでした。

/// <summary>
/// Gets this SiteMaps children.
/// </summary>
/// <value>The children.</value>
public List<SiteMap> Children {
  get {
    if (null == m_Children && !m_AttemptedToLoadChildren) {
      m_AttemptedToLoadChildren = true;

      m_Children = ctx.GetSiteMapChildrenByPath(_Path, 1).ToList();

      // Sorts ascending.
      m_Children.Sort(( sm1, sm2 ) => sm1.SortOrder.CompareTo(sm2.SortOrder));
      // CMS Sorts Descending, so reverse the list.
      m_Children.Reverse();
    }

    return m_Children;
  }
}

/// <summary>
/// Gets a value indicating whether this instance has any children.
/// </summary>
/// <value>
///  <c>true</c> if this instance has children; otherwise, <c>false</c>.
/// </value>
public bool HasChildren {
  get {
    if (null != Children && Children.Any()) {
      m_HasChildren = true;
    }

    return m_HasChildren;
  }
}

/// <summary>
/// Gets this SiteMaps parent.
/// </summary>
/// <value>The parent.</value>
public SiteMap Parent {
  get {
    if (null == m_Parent && null != _ParentId) {
      m_Parent = ctx.GetSiteMap(_ParentId);
    }

    return m_Parent;
  }
}

GetSiteMapストアド プロシージャをGetSiteMapChildrenByPath呼び出して階層を構築するのは、LINQ でそれを引き出すのが非常に複雑になるからです。

于 2010-01-29T22:47:52.550 に答える
0

こんにちは、私のカスタム SitMapProvider をご覧になりましたか?

これにより、アノテーションを使用してメタモデルから構造を取得し、非 DD ページ用の別のサイトマップ ファイルを取得できます。

于 2010-05-02T11:19:04.033 に答える