我接管了这个没有文档的网站(耶!)。也许这将有助于其他人了解SiteMap功能。我知道SiteMenu是如何构建的,但是想在这里与我的好友一起确认。
我有一个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:
<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),并将其返回给我的控件?
我有一种感觉,我已经把它弄下来,但希望得到确认和/或澄清,并希望将来帮助其他接管动态网站菜单项目的人。
答案 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" />