2013-04-15 25 views
1

我已经接管了这个网站没有文件(耶!)。也许这会帮助他人理解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 DOES指定一个网站地图:

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

LOC.DLL.objSiteMap继承SiteMapProvi der并且有重载/覆盖等。这些方法从数据库中获取一个表并构建一个SiteMapNode或SiteMapNodeCollection。

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

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

我有一种感觉,我已经明白了,但希望得到一个确认和/或澄清,并希望在未来帮助其他人动态站点菜单接管项目。

回答

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" /> 
+0

@ jdarnel27 - 现在我知道如何正确使用'Backquote'。感谢您的编辑。 – Win

+0

我很高兴能帮助你学会使用blockquote语法! – jadarnel27

+0

感谢您在SiteMapProvider属性中添加说明,这肯定会帮助任何需要此功能的人。什么会真正顶住这个答案将是说什么时候SiteMapDataSource被执行。在这种情况下,有一个源代码,一个DAL和一个UI(我实际上也有一个Web服务介于两者之间,但对此讨论无所谓)。据我的参考发现,SiteMapDataSource在网站启动时被缓存。 – Suamere

1

您的分析结果与您的收益相当。

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

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

+0

啊,陷阱。很好的捕获defaultProvider属性。 – Suamere

+0

@Suamere谢谢!我很高兴能够帮助=)我知道当你在没有文档的情况下浏览一个新项目时,很容易错过这样的事情(我以前肯定是在那里)。 – jadarnel27