1

我在没有任何文件的情况下接管了这个网站(耶!)。也许这将有助于其他人了解 SiteMap 功能。我知道 SiteMenu 是如何构建的,但想与我在 SO 的朋友确认一下。

我有一个 Main.Master ,它需要一个 SiteMenuHorizo​​ntal 用户控件。

<%@ 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),并将其返回给我的控件?

我有一种感觉,我已经把它记下来了,但想要得到确认和/或澄清,并希望在未来帮助其他通过动态站点菜单接管项目的人。

4

2 回答 2

1

您的分析非常正确。

我认为您缺少的主要联系是 web.config 值defaultProvider="objSiteMap"是导致SiteMapDataSource您的 UserControl 连接到 web.config 中的“objSiteMap”提供程序的原因。

由于它被设置为“默认提供程序”,因此您项目中的任何 SiteMap 都将使用该LOC.DLL.objSiteMap提供程序填充(除非您专门覆盖代码中的默认值)。

于 2013-04-15T16:11:50.003 回答
1

这个类如何填充我的网页?没有对 SiteMap 的可见调用。

SiteMapProvider 基于ASP.Net 的 Provider 模型,类似于 Membership 和 Role 提供者。

我的假设是:当网站(或页面)被构建(或编译?)时,我的用户控件调用它的数据源 Global.System.Web.UI.WebControls。站点地图数据源。不知何故,该控件引用 Web.Config 以获取对 LOC.DLL.objSiteMap 的引用,并运行 Override/Overload 方法来检索 SiteMapNode(/Collection),并将其返回给我的控件?

是的,你的假设是正确的。

您的用户控件调用默认站点地图提供程序objSiteMap,并且站点地图是在每个页面请求上动态创建的。

仅供参考:由于您已设置objSiteMap为默认提供程序,因此您无需执行任何操作。但是,如果您需要默认提供程序以外的提供程序,则需要显式设置提供程序名称。

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