在接下来的“定义数据方法”对话框中,针对Select语句选择GetListUsedTags方法。
图2. ObjectDataSource数据方法选择界面
注意,这个来自于业务逻辑层的方法看起来就象是在本地一样,这是因为它们修饰以特别的属性(已经在前面讨论过)。该GetListUsedTags方法来自于业务逻辑层,它负责返回一个至少存在一个博客入口的标签对象的列表。由于我们仅想显示这个标签列表,所以我们就不需要更新,插入或者删除等方法了。因此,我们可以单击“完成”按钮直接关闭配置向导。
接下来,我们在Page.Master文件中再添加一个ListView控件。然后,设置它的下列两个重要属性:
DataSourceID:我们需要把这个属性设置为我们刚刚创建的ObjectDataSource控件的ID。
ItemPlaceHolderID:把这个属性设置为itemContainer。
现在,既然我们配置好了ObjectDataSource和ListView控件,接下来我们就可以使用ListView控件的标记模板控制要输出的内容了。为此,我们使用了典型的静态标记与动态数据绑定方式的组合编码:
EnableViewState="False" ItemPlaceholderID="itemContainer">
<LayoutTemplate>
<h3>标签</h3>
<div class="content">
<ul class="linklist">
<li><a href="TagCloud.aspx">> 标签 <</a></li>
<asp:PlaceHolder ID="itemContainer" runat="server" />
</ul>
</div>
</LayoutTemplate>
<ItemTemplate>
<li><a href="BlogByTag.aspx?tag=<%# Eval("id") %>"><%#Eval("tagname") %></a></li>
</ItemTemplate>
<EmptyDataTemplate>
<h3>Tags</h3>
<div class="content">
<ul class="linklist">
<li>尚未提供标签。</li>
</ul>
</div>
</EmptyDataTemplate>
</asp:ListView>
在本文示例中,我们使用了ListView控件的三个不同的标记模板:
LayoutTemplate模板:这个模板生成标记的优异嵌套,它包含开始和结束标记。更为重要的是,在这个模板内部加入了itemContainer占位符控件,此控件将包含通过ItemTemplate模板生成的结果标记。
ItemTemplate模板:这个模板定义了针对每单个的标签需要生成的标记。易见,在上面的代码中综合使用了静态HTML和数据绑定标签属性(标签对象的id和tagname)。
EmptyDataTemplate模板:当不存在由ObjectDataSource控件返回的标签对象时使用这个模板。
在侧栏部分的按日期分布的文章和博客入口动态的链接列表也是以类似上面的方式工作:联合使用ListView和ObjectDataSource控件来配置要检索和显示的内容。