マスター ページにメニュー コントロールを設定する最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/54118

質問

データベース?ページ変数?列挙型?

ここで意見を求めています。

役に立ちましたか?

解決

ASP.NET サイトマップ機能はそのために構築されており、多くの場合に適切に機能します。希望の場所に着いたら、 メニューがサイトマップと異なって見えるようにするには、次のような回避策があります。.

動的なサイト構造がある場合は、次のことが可能です。 カスタム サイトマップ プロバイダーを作成する. 。価値があるというよりも面倒なことになるかもしれませんが、一般に、サイトマップからメニューを設定すると、メニュー オプションがログイン ユーザーに適したセキュリティ トリミングなどの優れた機能が得られます。

他のヒント

それは興味深い質問ですね、それにアプローチする方法はたくさんあります。

XML からメニュー構造を読み込むことができます。これが、組み込みの ASP.NET ナビゲーション コントロール/「サイトマップ」セットアップの動作方法です。これはおそらく全体的には良い選択であり、Visual Studio にはこれに適した適切なツールが用意されています。

多くの変更が必要な動的メニューの場合は、データベースから項目を取得するのが良い考えですが、ページがレンダリングされるたびに DB がヒットしないように、項目をキャッシュすることをお勧めします。

を使用してサイトを作成しました ASP.NET ログイン コントロール そして フォーム認証 ASP.NET Web アプリケーションのメンバーシップ/資格情報用。そして私が使っているのは、 サイトマップ サイトナビゲーション用。

SiteMapDataSource を使用して ASP.NET TreeView および Menu ナビゲーション コントロールを設定しました。ただし、立ち入り禁止の管理者専用ページは、管理者以外のユーザーにも表示されます。

  1. web.sitemap サイト マップ ファイルを作成しました。そして私 ASP.NET Web サイト管理ツールを使用してアクセス ルールを設定しました.

  2. .master ページにナビゲーション コントロールを追加しました…

    <asp:SiteMapPath ID="SiteMapPath1" runat="server" />
    <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource2" />
    <asp:TreeView ID="TreeView1" runat="server"  DataSourceID="SiteMapDataSource1" />
    <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
    <asp:SiteMapDataSource ID="SiteMapDataSource2" runat="server" ShowStartingNode="False" />
    
  3. web.config ファイルで securityTrimmingEnabled を「true」に設定しました…

    <?xml version="1.0"?>
    <configuration>
        ...
        <system.web>
            ...
            <siteMap defaultProvider="default">
                <providers>
                    <clear/>
                    <add name="default"
                        type="System.Web.XmlSiteMapProvider"
                        siteMapFile="web.sitemap"
                        securityTrimmingEnabled="true"/>
                </providers>
            </siteMap>
            ...
        </system.web>
        ...
    </configuration>
    
  4. master.vbコードビハインドファイルのツリーを調整しました…

    Protected Sub TreeView1_DataBound( ByVal sender As Object, ByVal e As EventArgs ) Handles TreeView1.DataBound
    
        'Collapse unnecessary menu items...
        If TreeView1.SelectedNode IsNot Nothing Then
            Dim n As TreeNode = TreeView1.SelectedNode
            TreeView1.CollapseAll()
            n.Expand()
            Do Until n.Parent Is Nothing
                n = n.Parent
                n.Expand()
            Loop
        Else
            TreeView1.ExpandAll()
        End If
    
    End Sub
    

メニューが動的である場合 ユーザーごとの その場合は、各ユーザーのデータベースにアクセスする必要があります。それ以降は、データベースへの往復を避けるために、おそらくセッションに保存することになります。

動的であってもサイト全体で同じアイテムが表示される場合は、それをデータベースに入れて結果をキャッシュします。

確かに、サイトマップにバインドするのが最も簡単です。

それはサイトの仕組みに完全に依存します。通常、サイトマップが最善の方法であるという意見に私も同意します。ただし、CMS を使用している場合は、CMS をデータベースに保存する必要がある場合があります。分類中心のサイトがある場合は、分類を使用してメニューを構築します。ナビゲーションを行うための「最適な方法」はありません。特定の状況に応じた最適な方法があるだけです。

同様の機能があります。

表示されるメニュー オプションはユーザーの権限に依存するため、アプリケーション メニューはデータベースからマスター ページにロードされます。

データベース上のいくつかの規則と巧妙な構造により、メニュー読み込みコードが汎用的であり、特定のメニュー オプションを選択すると自動的に適切な画面に移動することが保証されます。ナビゲーションには UIP を使用し、Web コントロールには ComponentArt を使用します。

ところで、ComponentArtは最悪です。繰り返しになりますが、サードパーティのコントロール ライブラリはすべてそうであると思います。

ユーザーの観点から見ると、効率的なアクセスは最も重要な機能です。一般的な示唆に富んだアプローチは次のとおりです。辞書引き、それは大きなメニュー構造とネストされたメニュー構造にも適しています。ユーザーはクリックまたは独自のキー押下によってナビゲートし、さらに矢印キーで通常どおり上下に進む (右) または戻る (左) こともできます。最初のメニューを除いてリクエストに応じてメニューを設定し、最後の要素が選択されるたびに JavaScript アクションを提供することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top