我在没有任何文件的情况下接管了这个网站(耶!)。也许这将有助于其他人了解 SiteMap 功能。我知道 SiteMenu 是如何构建的,但想与我在 SO 的朋友确认一下。
我有一个 Main.Master ,它需要一个 SiteMenuHorizontal 用户控件。
<%@ 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 确实指定了一个站点地图:
<siteMap enabled="true" defaultProvider="objSiteMap">
<providers>
<clear/>
<add name="objSiteMap" type="LOC.DLL.objSiteMap" securityTrimmingEnabled="true" expirationInterval="1"/>
</providers>
</siteMap>
LOC.DLL.objSiteMap 继承 SiteMapProvider 并具有重载/覆盖等。这些方法从数据库中获取表并构建 SiteMapNode 或 SiteMapNodeCollection。
我的困惑是:这个类如何填充我的网页?没有对 SiteMap 的可见调用。
我的假设是:当站点(或页面)被构建(或编译?)时,我的用户控件调用它的数据源 Global.System.Web.UI.WebControls.SiteMapDataSource。不知何故,该控件引用 Web.Config 以获取对 LOC.DLL.objSiteMap 的引用,并运行 Override/Overload 方法来检索 SiteMapNode(/Collection),并将其返回给我的控件?
我有一种感觉,我已经把它记下来了,但想要得到确认和/或澄清,并希望在未来帮助其他通过动态站点菜单接管项目的人。