离三点钟还有半个小时,趁机把自己编程的一个小的技巧写下来吧!废话不多说了。
我们都知道在ASP里面,VBScript是嵌套在网页里面被解释执行的,也就是说代码和界面混杂在一起,所以用起来和维护起来非常的麻烦。在ASP.NET里面情况有了本质上的变化,界面已经和代码基本没有大的关系了,一个ASPX页面对应一个CS或VB文件,可以说基本做到了代码和界面的分离。其实微软是伟大的,它做的ASP.NET其实是一个框架,在该框架中提供了几个关键的方法,使得我们可以做到代码和界面的进一步分离,比如CommunityServer中就很好的利用了这点。在CommunityServer中已经将ASPX文件的后台CS全部分离,转而通过用户控件或服务器控件实现,而用户控件的后台代码都放在另外一个项目中,这样就形成了界面层中几乎只包括ASPX、ASCX等文件,而它们的后台CS文件都移到了其他项目中,所以这就做到了进一步的分离,你说对吧?
我上面说的分离只要研究过CS的人因该都是知道的,但是下面这个技巧可能你就不一定知道了。
如果你现在要显示一个实体的详细信息,比如一篇新闻、一篇文章、一个产品,等等。你一般会怎么做呢?我想大部分人都是调用一个类似GetObject(int objectID)的方法,然后把该Object取出来,然后你会怎么办呢?通常你会在页面上放一些Label,Literal,或者其他服务器控件之类的,每个控件都有一个你自己命名的ID,然后你会在页面的Load事件处理函数中通过FindControl函数找到这些界面上的服务器控件,然后为其一个个赋值。这样就达到了显示详细信息的目的。但是你有没有想过,这样做已经讲界面和后台CS代码绑定在一起了,如果你删除了某个服务器控件或者修改了它的ID,那你的代码如果没有Try起来或者做空值判断,那肯定会出问题了。所以,为了能够既可以显示详细信息,又可以将代码和界面的耦合减到最少,我想到了一种方法,如下:
我们可以在界面上放一个Repeater控件,在这个控件的ItemTemplate模版中将当前的Container.DataItem对象取出来,然后,你可以通过DataBinder.Eval函数取出该对象中的任何一个字段,然后在和某个客户端标记绑定,或者直接显示出来。在后台CS文件中,你唯一要做的只是把页面上的Repeater控件得到,然后把你通过GetObject函数得到的那个数据对象放到一个集合中,并把这个集合和这个Repeater控件绑定即可。通过这样的方式说白了就是把显示一个实体当作和显示一个列表一样来处理。这样做有点奇怪,所以我想很多人确实不会那样去想或做。关于前台如何显示数据,下面是一段示例HTML代码:
<%@ Register TagPrefix="CS" Namespace="NetFocus.Web.Controls" Assembly="NetFocus.Web.Controls" %>
<%@ Register TagPrefix="CS" Namespace="NetFocus.WebApplications.Article.Controls" Assembly="NetFocus.WebApplications.Article" %>
<%@ Import Namespace="NetFocus.WebApplications.Article.Components" %>
<%@ Import Namespace="NetFocus.Web.Components" %>
<%@ Control Language="C#" %>
<div class="designpattern-detail1">
<asp:Repeater EnableViewState="false" runat="server" id="list">
<ItemTemplate>
<div class="title">
<%# DataBinder.Eval(Container.DataItem, "Subject") %>
</div>
<div class="subtitle">
<CS:ResourceLiteral runat="server" ResourceName="PostDate" />
<%# DataBinder.Eval(Container.DataItem, "PostDate") %>
<CS:ResourceLiteral runat="server" ResourceName="Source" />
<%# DataBinder.Eval(Container.DataItem, "Source") %>
<CS:ResourceLiteral runat="server" ResourceName="Replies" />
<%# DataBinder.Eval(Container.DataItem, "Replies") %>
</div>
<div class="body">
<%# DataBinder.Eval(Container.DataItem, "Body") %>
</div>
</ItemTemplate>
</asp:Repeater>
</div>
以上这段代码是我的NetFocus个人站点中显示文章详细信息时前台用户控件中所使用的代码。各位看这段代码的时候可以和你正在浏览的网页的布局结合起来看,就很容易懂了。
好了,不知道这样我有没有说清楚,时间正好是半个小时,呵呵。