我的菜单项来自哪里?

时间:2013-04-15 15:58:17

标签: asp.net vb.net

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

我有一个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:

<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调用。

我的假设是这样的: 当构建(或编译?)站点(或页面)时,我的用户控件调用其Datasource,Global.System.Web.UI.WebControls.SiteMapDataSource。不知何故,该控件引用Web.Config来引用LOC.DLL.objSiteMap,并运行Override / Overload方法来检索SiteMapNode(/ Collection),并将其返回给我的控件?

我有一种感觉,我已经把它弄下来,但希望得到确认和/或澄清,并希望将来帮助其他接管动态网站菜单项目的人。

2 个答案:

答案 0 :(得分:1)

通过分析你的钱非常合适。

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

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

答案 1 :(得分:1)

  

这个课如何填充我的网页?没有可见的电话   到SiteMap。

SiteMapProvider基于ASP.Net's Provider model,类似于成员资格和角色提供程序。

  

我的假设是:建立网站(或网页)时(或   编译?),我的用户控制调用其数据源,   Global.System.Web.UI.WebControls。的SiteMapDataSource。不知何故,那   控件引用Web.Config作为参考   LOC.DLL.objSiteMap,并运行Override / Overload方法进行检索   一个SiteMapNode(/ Collection),并将它返回给我的控件?

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

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

仅供参考:由于您已将objSiteMap设置为默认提供者,因此您无需执行任何操作。但是,如果您需要非默认提供程序,则需要明确设置提供程序名称。

<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" 
 SiteMapProvider="AnotherProvider" />