1

私はドキュメントなしでこのウェブサイトを乗っ取りました (イェイ!)。これは、他のユーザーが SiteMap の機能を理解するのに役立つかもしれません。SiteMenu がどのように構築されているかはわかりますが、ここ SO の仲間に確認したいと思います。

SiteMenuHorizo​​ntal ユーザー コントロールを呼び出す Main.Master があります。

<%@ Register Src="uc2Menu.ascx" TagPrefix="uc2" TagName="smHorizontal" %>
...
<uc2:smHorizontal id="uc2Menu" runat="server" />

ユーザー コントロールは非常に単純です。

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="uc2Menu.ascx.vb" Inherits="uc2Menu" %>
<asp:Menu id="siteMenu" runat="server" DataSourceID="menuSiteMapDataSource" Orientation="Horizontal" />

<asp:SiteMapDataSource ID="menuSiteMapDataSource" runat="server" ShowStartingNode="false" />

コントロールのコードビハインドからの助けはありません:

Public Partial Class uc2Menu
Inherits System.Web.UI.UserControl

Protected Sub siteMenu_MenuItemDataBound(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles siteMenu.MenuItemDataBound
    e.Item.Target = CType(e.Item.DataItem, SiteMapNode)("Target")
End Sub
End Class

Web.Config DOES は SiteMap を指定します。

<siteMap enabled="true" defaultProvider="objSiteMap">
    <providers>
        <clear/>
        <add name="objSiteMap" type="LOC.DLL.objSiteMap" securityTrimmingEnabled="true" expirationInterval="1"/>
    </providers>
</siteMap>

LOC.DLL.objSiteMap は SiteMapProvider を継承し、オーバーロード/オーバーライドなどがあります。メソッドは DB からテーブルを取得し、SiteMapNode または SiteMapNodeCollection を構築します。

私の混乱は次のとおりです。このクラスはどのように私の Web ページにデータを入力していますか? SiteMap への目に見える呼び出しはありません。

私の仮定は次のとおりです。サイト (またはページ) が構築 (またはコンパイル) されると、ユーザー コントロールはそのデータソース、Global.System.Web.UI.WebControls.SiteMapDataSource を呼び出します。どういうわけか、そのコントロールは LOC.DLL.objSiteMap への参照のために Web.Config を参照し、Override/Overload メソッドを実行して SiteMapNode(/Collection) を取得し、それを私のコントロールに戻しますか?

私はそれを理解していると感じていますが、確認および/または明確化を得たいと思っており、将来、動的なサイトメニューでプロジェクトを引き継ぐ他の人を助けたいと思っています.

4

2 に答える 2

1

このクラスは Web ページにどのように入力されていますか? SiteMap への目に見える呼び出しはありません。

SiteMapProvider は、 ASP.Net の Provider モデルに基づいており、Membership および Role プロバイダーと同様です。

私の仮定は次のとおりです。サイト (またはページ) が構築 (またはコンパイル) されると、ユーザー コントロールはそのデータソースである Global.System.Web.UI.WebControls を呼び出します。SiteMapDataSource。どういうわけか、そのコントロールは LOC.DLL.objSiteMap への参照のために Web.Config を参照し、Override/Overload メソッドを実行して SiteMapNode(/Collection) を取得し、それを私のコントロールに戻しますか?

はい、あなたの仮定は正しいです。

ユーザー コントロールがデフォルトのサイト マップ プロバイダーobjSiteMapを呼び出し、ページ リクエストごとにサイトマップが動的に作成されます。

参考までに、defaultprovider として設定objSiteMapしたので、何もする必要はありません。ただし、デフォルト以外のプロバイダーが必要な場合は、プロバイダー名を明示的に設定する必要があります。

<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" 
 SiteMapProvider="AnotherProvider" />
于 2013-04-15T16:26:29.897 に答える
1

あなたの分析によると、あなたはほとんど正しいです。

ここであなたが見逃していると思う主な接続は、web.config の値defaultProvider="objSiteMap"が原因SiteMapDataSourceで、UserControl が web.config の「objSiteMap」プロバイダーに接続されることです。

これは「デフォルト プロバイダー」として設定されているため、プロジェクト内のすべての SiteMap はそのLOC.DLL.objSiteMapプロバイダーを使用して入力されます (コードでデフォルトを明示的にオーバーライドしない限り)。

于 2013-04-15T16:11:50.003 に答える