60创建一个自定义的DatabaseDriven Site Map Provider.docx
- 文档编号:18526373
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:34
- 大小:925.53KB
60创建一个自定义的DatabaseDriven Site Map Provider.docx
《60创建一个自定义的DatabaseDriven Site Map Provider.docx》由会员分享,可在线阅读,更多相关《60创建一个自定义的DatabaseDriven Site Map Provider.docx(34页珍藏版)》请在冰点文库上搜索。
60创建一个自定义的DatabaseDrivenSiteMapProvider
六十:
创建一个自定义的Database-DrivenSiteMapProvider
导言:
ASP.NET2.0的网站地图(sitemap)功能允许页面开发者在一些持久介质(persistentmedium),比如一个XML文件里,自己定义一个web程序的sitemap.一旦定义了之后,我们可以通过System.Web命名空间的SiteMapclass类或某个Web导航控件,比如SiteMapPath,Menu,或TreeView来对其进行访问。
sitemap系统使用的是providermodel模式,所以可以创建不同的sitemap,并将其应用到一个web应用程序。
ASP.NET2.0默认的sitemapprovider,其结构为一个XML文件。
在教程《MasterPagesandSiteNavigation》里我们创建了一个Web.sitemap文件,它就包含了这种结构,并且在教程的每一个新部分里我们都要更新其XML.
当sitemap的结构是静态的时候,默认的这种基于XML(XML-based)的sitemapprovider工作正常,就像本系列教程一样。
但是在很多时候我们需要动态的sitemap.如图1的sitemap,每个种类以及属于该种类的产品在网站的结构里做层次状体系分布。
在该sitemap里,当访问根目录的web页面时,将列出所有的种类;再访问某个具体的种类的根目录时,将列出属于该种类的所有产品;再访问某个具体的产品时将列出该产品的详细信息。
图1:
Categories和Products构成了SiteMap的层次结构
这种基于category和product的结构可以通过"硬编码"的方式添加到Web.sitemap文件.每当对category或product进行添加、删除、重命名等操作时,都需要对该文件进行更新。
很自然的,如果其结构是通过数据库,或更理想地,是从业务逻辑层来获取的,那么对sitemap的维护是很简单的。
那样的话,只要对products和categories进行添加、删除、重命名时,sitemap会自动的更新以反应这些变化。
由于ASP.NET2.0的sitemap是建立在provider模式的基础上的,因此我们可以创建一个自定义的sitemapprovider,从数据库或某个层来获取数据.在本文,我们创建的provider将从业务逻辑层获取数据。
让我们开始吧!
注意:
本文创建的用户定制sitemapprovider仅仅依赖于系统的层及其数据模式(datamodel)。
JeffProsise的文章《StoringSiteMapsinSQLServer》(
和《TheSQLSiteMapProviderYou'veBeenWaitingFor》
(
考察了将sitemap数据存储在SQLServer的方法。
第一步:
创建用户定制SiteMapProvider页面
在创建用户定制SiteMapProvider之前,先添加本章将用到的ASP.NET页面。
首先添加一个名为SiteMapProvider的文件夹;然后在文件夹里添加如下所示的页面确保采用母版Site.master:
Default.aspx
ProductsByCategory.aspx
ProductDetails.aspx
同样,在App_Code文件夹里添加CustomProviders
图2:
添加相关的ASP.NET页面.
由于这部分只有一篇文章,没有必要使Default.aspx页面列出本部分的文章;我们将在Default.aspx里用一个GridView控件来列出categories,在第二步里探讨.
然后,更新Web.sitemap使其包含对Default.aspx页面的引用。
特别的,在“Caching”
?
1
2
3
title="CustomizingtheSiteMap"url="~/SiteMapProvider/Default.aspx" description="LearnhowtocreateacustomproviderthatretrievesthesitemapfromtheNorthwinddatabase."/> 完成Web.sitemap的更新后,花点时间在浏览器里登录页面,在左面的菜单里包含了本教程的条目。 图3: SiteMap现在包含了本章的条目 本教程主要考察如何创建一个用户自定义的sitemapprovider,及对设置web应用程序进行包含该sitemapprovider.具体来讲,它返回的网站地图(sitemap)不仅包含了根节点,而且包含每个种类节点和产品节点,就像图1显示的那样。 总的来说,网站地图里的每一个节点都对应一个具体的URL.就我们的网站地图而言,根节点的URL为~/SiteMapProvider/Default.aspx,它列出了所有产品和种类;每个种类节点对应的URL为~/SiteMapProvider/ProductsByCategory.aspx? CategoryID=categoryID,它根据指定的categoryID列出该种类的所有产品;最后,每个产品对应的URL为~/SiteMapProvider/ProductDetails.aspx? ProductID=productID,它根据指定的productID值,列出该产品的详细信息。 首先,让我们创建Default.aspx,ProductsByCategory.aspx和ProductDetails.aspx页面。 我们将分别在第二、三、四步创建这些页面.因为本文的重点是sitemapproviders,并且这种主/从页面在前面的教程里已经讨论过了,我们在第2到第4步将一笔带过,如果你对这种主/从页面页面不是很了解的话,请参考前面的教程之9《Master/DetailFilteringAcrossTwoPages》. 第二步: 将Categories显示出来 打开文件夹SiteMapProvider里的Default.aspx页面,在设计模式里从工具箱拖一个GridView控件到页面,设置其ID为Categories.从其智能标签里,将其绑定到一个名为CategoriesDataSource的ObjectDataSource,设置其使用CategoriesBLL类的GetCategories方法。 因为该GridView控件只是显示categories而不修改数据,因此在UPDATE,INSERT和DELETE标签里选“(None)”. 图4: 设置ObjectDataSource使用GetCategories方法返回Categories 图5: 在UPDATE,INSERT和DELETE标签里选“(None)” 设置完成后,VisualStudio会自动的添加CategoryID,CategoryName,Description,NumberOfProducts和BrochurePath这些绑定列(BoundField),修改GridView,使其只包含CategoryName和Description两列,且将CategoryName绑定列的HeaderText属性改为“Category”. 然后,添加一个HyperLinkField,将其放在最左边,设其DataNavigateUrlFields属性为CategoryID;DataNavigateUrlFormatString属性为~/SiteMapProvider/ProductsByCategory.aspx? CategoryID={0};再将Text属性设置为“ViewProducts”. 图6: 为GridView添加一个HyperLinkField 创建完ObjectDataSource并定制GridView控件的列后,这2个控件的声明代码看起来应该和下面的差不多: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 GridViewID="Categories"runat="server"AutoGenerateColumns="False" DataKeyNames="CategoryID"DataSourceID="CategoriesDataSource" EnableViewState="False"> HyperLinkFieldDataNavigateUrlFields="CategoryID" DataNavigateUrlFormatString= "~/SiteMapProvider/ProductsByCategory.aspx? CategoryID={0}" Text="ViewProducts"/> BoundFieldDataField="CategoryName"HeaderText="Category" SortExpression="CategoryName"/> BoundFieldDataField="Description"HeaderText="Description" SortExpression="Description"/> GridView> ObjectDataSourceID="CategoriesDataSource"runat="server" OldValuesParameterFormatString="original_{0}"SelectMethod="GetCategories" TypeName="CategoriesBLL"> ObjectDataSource> 图7显示的是在浏览器里查看的Default.aspx页面,点某个类的“ViewProducts”链接,将会转到ProductsByCategory.aspx? CategoryID=categoryID页面,该页面我们将在第三步新建。 图7: 每个类都有一个“ViewProducts”链接 第三步: 显示指定类的所有产品 打开ProductsByCategory.aspx页面并添加一个GridView控件,设其ID为ProductsByCategory.从其智能标签,将其绑定到一个名为ProductsByCategoryDataSource的ObjectDataSource;设置它使用ProductsBLL类的GetProductsByCategoryID(categoryID)方法;在UPDATE,INSERT,和DELETE标签里选择“(None)”. 图8: 使用ProductsBLL类的GetProductsByCategoryID(categoryID)方法 设置向导的最后一步是指定categoryID的参数来源,因为此信息是通过查询字符串(querystringfield)CategoryID来传递的,因此在参数来源里选QueryString,在QueryStringField里输入“CategoryID”;如图9所示,点Finish完成设置. 图9: 为参数categoryID指定CategoryIDQuerystringField 完成设置后,VisualStudio将为GridView添加相应的绑定列以及CheckBo列;将除ProductName,UnitPrice,SupplierName外的列删除掉。 将这3个列的HeaderText属性分别设置为“Product”,“Price”,and“Supplier”,将UnitPrice列格式化为货币形式. 然后,添加一个HyperLinkField列,并将其放在最左边;设其Text属性为“ViewDetails”,设其DataNavigateUrlFields属性为ProductID;其DataNavigateUrlFormatString属性为~/SiteMapProvider/ProductDetails.aspx? ProductID={0}. 图10: 添加一个“ViewDetails”HyperLinkField,以链接到ProductDetails.aspx 完成后,GridView和ObjectDataSource的声明代码为: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 GridViewID="ProductsByCategory"runat="server"AutoGenerateColumns="False" DataKeyNames="ProductID"DataSourceID="ProductsByCategoryDataSource" EnableViewState="False"> HyperLinkFieldDataNavigateUrlFields="ProductID" DataNavigateUrlFormatString= "~/SiteMapProvider/ProductDetails.aspx? ProductID={0}" Text="ViewDetails"/> BoundFieldDataField="ProductName"HeaderText="Product" SortExpression="ProductName"/> BoundFieldDataField="UnitPrice"DataFormatString="{0: c}" HeaderText="Price"HtmlEncode="False" SortExpression="UnitPrice"/> BoundFieldDataField="SupplierName"HeaderText="Supplier" ReadOnly="True"SortExpression="SupplierName"/> GridView> ObjectDataSourceID="ProductsByCategoryDataSource"runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProductsByCategoryID"TypeName="ProductsBLL"> QueryStringParameterName="categoryID" QueryStringField="CategoryID"Type="Int32"/> ObjectDataSource> 返回来登录Default.aspx页面,点Beverages(饮料)的“ViewProducts”链接,这将转到ProductsByCategory.aspx? CategoryID=1页面,显示饮料类的所有产品的names,prices,和suppliers信息(见图11)。 尽管改进该页面吧,添加一个链接以方便用户返回上一页(Default.aspx).还可以添加一个DetailsView或FormView控件来显示该种类的名称和描述。 图11: 显示Beverages类的Names,Prices,Suppliers信息 第四步: 显示产品的详细信息 最后要创建的页面—ProductDetails.aspx,是用来显示指定产品的详细信息的。 打开ProductDetails.aspx页面,从工具箱拖一个DetailsView控件到页面,设置其ID为ProductInfo,并清除其Height和Width属性值。 在其智能标签里,绑定到一个名为ProductDataSource的ObjectDataSource,设置该ObjectDataSource使用ProductsBLL类的GetProductByProductID(productID)方法。 在UPDATE,INSERT,和DELETE标签里选“(None)”. 图12: 设置该ObjectDataSource控件调用GetProductByProductID(productID)方法 最后,需要设置参数productID的来源,由于数据通过查询字符串ProductID来传递,在参数源下拉列表里选QueryString,在QueryStringField对话框里输入“ProductID”.最后,点Finish按钮完成设置。 图13: 设置参数productID来源于查询字符串 完成设置后,VisualStudio会为DetailsView控件添加相应的绑定列和CheckBox列,移除ProductID,SupplierID,和CategoryID列,剩下的列想怎样设就怎样设置吧。 我对界面做了些优化,这样的话,声明代码看起来像下面这样: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 DetailsViewID="ProductInfo"runat="server"AutoGenerateRows="False" DataKeyNames="ProductID"DataSourceID="ProductDataSource" EnableViewState="False"> BoundFieldDataField="ProductName"HeaderText="Product" SortExpression="ProductName"/> BoundFieldDataField="CategoryName"HeaderText="Category" ReadOnly="True"SortExpression="CategoryName"/> BoundFieldDataField="SupplierName"HeaderText="Supplier" ReadOnly="True"SortExpression="SupplierName"/> BoundFieldDataField="QuantityPerUnit"HeaderText="Qty/Unit" SortExpression="QuantityPerUnit"/> BoundFieldDataField="UnitPrice"DataFormatString="{0: c}" HeaderText="Price"HtmlEncode="False" SortExpression="UnitPrice"/> BoundFieldDataField="UnitsInStock"HeaderText="UnitsInStock" SortExpression="UnitsInStock"/> BoundFieldDataField="UnitsOnOrder"HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder"/> BoundFieldDataField="ReorderLevel"HeaderText="ReorderLevel" SortExpression="ReorderLevel"/> CheckBoxFieldDataField="Discontinued"HeaderText="Discontinued" SortExpression="Discontinued"/> DetailsView> ObjectDataSourceID="ProductDataSource"runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProductByProductID"TypeName="ProductsBLL"> QueryStringParameterName="productID" QueryStringField="ProductID"Type="Int32"/> ObjectDataSource> 来对该页面进行测试,返回Default.aspx页面,点种类Beverages的“ViewProducts”链接;再点产品ChaiTea的“ViewDetails”链接。 这将转到ProductDetails.aspx? ProductID=1页面,其显示的是ChaiTea的详细信息(如图14所示). 图14: ChaiTea的Supplier,Category,Price等信息显示出来了 第五步: 理解SiteMapProvider的内部处理机制 sitemap呈现的是源于某种层次结构的SiteMapNode实例集(a collectionofSiteMapNodeinstances)。 其必须有一个根节点,所有的非根节点都有一个父节点,且每个节点都可以有任意数量的子节点.每个SiteMapNode对象对应的是website体系结构的某个部分。 这些部分通常都有对应的web页面,因此,SiteMapNodeclass类有像Title,Url,和Description这样的属性,它们用来描述SiteMapNode所对应部分的相关信息。 还有一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 60创建一个自定义的DatabaseDriven Site Map Provider 60 创建 一个 自定义 DatabaseDriven