侧栏部分的最后一部分是一个用户可以订阅的回馈信息列表。这个列表是静态的,因此在Page.Master文件中可以使用简单的标记来实现,相应代码如下:
<div class="content">
<ul class="linklist">
<li><a id="RSSBlogs" href="~/View/RSS/RSSBlogs.aspx" runat="server">博客入口</a></li>
<li><a id="RSSArticles" href="~/View/RSS/RSSArticles.aspx" runat="server">文章</a></li>
<li><a id="RSSComments" href="~/View/RSS/RSSComments.aspx" runat="server">评论</a></li>
</ul>
</div>
【注意】通过把标签标记以runat="server",我们可以使用这一技巧方便地链接到我们的web应用程序的根目录下。
至此,我们完成了母版页面Page.Master的创建。你可能注意到,在这个母版页面中我们链接到了若干我们现在还未创建的.aspx页面。不必担心,稍后我们会讨论这些内容。
现在,我们可以正式构建我们的第一个用户接口页面。你会看到我们以前的努力将有助于我们迅速地开发这些页面。借助于我们的母版页面架构,我们将要构建的每一个新的用户接口页面主要的任务就是,使用标准ASP.NET控件结合我们需要的内容来填充内容栏目,而所有其它的内容会由系统以一种一致的方式自动生成。
至此,我们可以得出这样的结论:大多数的用户接口页面主要是列出按出版日期排序(默认的)的博客入口,标签和发表的文章。尽管对每一个博客概要信息页面来说排序及过滤方式可能有所不同,但是,以这种列表的方式显示一个博客入口的内容对于所有的这些页面是相同的。
考虑到上述情况,我们可以开发一个用户控件来减少标记及代码的重用。在ASP.NET开发中一个方便的重用相关联的标记和控件就是创建一个web用户控件。在博客案例中,Web用户控件BlogList.ascx位于方案的View/Controls文件夹下。该控件中包含了三个元素:
? 一个ListView—定义博客入口列表标记。
? 一个DataPager—负责实现ListView控件中博客入口的分页显示。
? 一个事件。该控件的后台代码文件中包含了一个代理方法ImplodeTags,由此方法调用当前页面的基页面中真正的ImplodeTags函数。在ASP.NET中,由于数据绑定复杂的对象的限制,所以需要这样的方法。
注意,ObjectDataSource控件并不是Web用户控件的一部分,因为对于每一个博客入口而言这一部分一般是不同的。为此,我们把Web用户控件内部的ListView控件隐式地链接到一个名字为ObjectDataSourceBlogs的ObjectDataSourceControl控件。
设计系统主页—Home.aspx
在构建了可重用的Web用户控件后,我们现在可以开始创建系统主页面。具体过程如下:
1. 创建一个新的ASPX页面,命名为Home.aspx。
2. 设置此新页面的母版页面属性指向Page.Master文件。
3. 删除Page标签下面所有的内容并插入ContentPlaceHolder标签。我们将把我们的内容填加到这个中间去。
4. 在ContentPlaceHolder标签内添加一个标签控件。在Page_Load函数中,用应用程序配置参数(由博客管理员来维护的,存储于文件web.config中)来填充这个标签的值。
5. 把web用户控件BlogList拖动到contentplaceholder标签内。
6. 添加一个ObjectDataSource控件,命名为“ObjectDataSourceBlogs”。配置它,使之使用业务逻辑层BlogEntryManager类中的GetList方法。确保ObjectDataSource控件支持分页功能,因为我们仅仅想在主页上显示最后三个博客入口(详见下面的代码)。