一、我們用之前的例子作為基礎,現在做一個符合下面條件的查詢並顯示出來:1、IsActive=1(激活狀態)。2、ClassID=參數。3、按CreatedDate和Priority進行降序排列。因此我們在Announcement.hbm.XML中加入我們的搜索信息(為何是加在這裡?因為它是使用NHibernate來進行查詢的),下面是Announcement.hbm.XML的完成代碼:
二、查詢工作屬於業務邏輯層,因為你的業務就是負責顯示最新有用的新聞消息,所以你必須要有一個Announcement的邏輯層對象:AnnouncementManager。因此,我們要在Index頁面中使用該對象,我們就需要在Index頁面創建時創建該對象,因此我們對Index的Spring的配置需要修改,我們打開spring.Net_bean_Index.XML看一下,下面是它的所有代碼:
<?XML version="1.0" encoding="utf-8" ?>
<objects XMLns='http://www.springframework.Net'>
<!-- DAO定義-->
<object id="AnnouncementDAO" type="DZ_Portal.App.DAL.AnnouncementDAO,DZ_Portal.App" parent="baseDao">
</object>
<!--Manager定義-->
<object id="AnnouncementManager" type="DZ_Portal.App.BLL.AnnouncementManager,DZ_Portal.App">
<property name="AnnouncementDAO" ref="AnnouncementDAO"/>
</object>
<!-- 事務
<object id="AnnouncementManagerTrans" parent="BaseTransactionManager">
<property name="Target" ref="AnnouncementManager"/>
<property name="ProxyInterfaces" value="DZ_Portal.App.BLL.IAnnouncementManager"/>
<property name="TransactionAttributes">
<name-values>
<add key="TestTransAction*" value="PROPAGATION_REQUIRED,-TransActionException"/>
</name-values>
</property>
</object>-->
<!-- 頁面定義 -->
<object type="~/Index.ASPx" parent="adminPageM"
>
<property name="AnnouncementManager" ref="AnnouncementManager"/>
<!--<property name="AnnouncementManager" ref="AnnouncementManagerTrans"/>-->
</object>
</objects>
解說:我們采用的是屬性注入的方式來實現Index頁面創建時創建AnnouncementManager,而AnnouncementManager創建的時候又以屬性注入的方式來創建AnnouncementDAO。(一個完整的對象是有3層的:分別是:顯示層、業務邏輯層、業務實體,現在我們的顯示層為Index頁面,邏輯層就是AnnouncementManager,我們不能沒有業務實體層,因此,創建邏輯層時必須創建業務實體層,而創建業務實體的,正好是這個AnnouncementDAO,它采用工廠模式來生產我們需要的業務實體),這就完整地解釋了這個頁面的相關配置。(我有個想法,就是,這些不同層的對象基本上都是一起的,如果其它頁面需要實現他們時,同樣又要定義一次?或者不定義--可以不定義,那樣,以後維護的時候會很亂的,我有個想法是把他們放到另一個單元叫:Spring.Net_bean_Announcement,意思是說:Announcement對象的Spring配置,這樣就必須在web.config中加入該spring的配置,現在我們暫時不這樣做了,就讓它這樣吧)。
三、查詢配置好、查詢執行對象已在spring中配置好、現在就要在顯示層中使用這些已做好的東西了,我把所有代碼列出來,在後面會解說的:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using FastSpring.Web.Base;
using DZ_Portal.App.BLL;
using DZ_Portal.App.Model;
public partial class Index : BasePageSession
...{
protected void Page_PreInit(Object sender, EventArgs e)
...{
if (!IsPostBack)
DOShowAnnouncements();
}
protected void Page_Load(object sender, EventArgs e)
...{
this.Response.Redirect("~/SystemAdmin/fsLogin.ASPx", false);
//IList Announcements = m_AnnouncementManager.FindEntityListByNamedQueryOfRecord("GetAnnouncementsOfClassID", "101", 0, 10);
}
AnnouncementManager#region AnnouncementManager
private IAnnouncementManager m_AnnouncementManager;
public IAnnouncementManager AnnouncementManager
...{
set
...{
m_AnnouncementManager = value;
}
}
#endregion
protected void DOShowAnnouncements()
...{
IList Announcements = m_AnnouncementManager.FindEntityListByNamedQueryOfRecord("GetAnnouncementsOfClassID", "101", 0, 10);
WebControlDataBind(this.FSFindControl("FSPagerList"), Announcements);
int i = Announcements.Count;
}
VL_DataBind#region VL_DataBind
public virtual void WebControlDataBind(System.Web.UI.Control WebControl, IList DataSource)
...{
try
...{
if ((WebControl == null) | (DataSource == null))
...{
//沒有找到列表顯示控件
PrintLog("WebControl is null or DataSource is null");
return;
}
//根據不同的列表顯示控件,進行數據綁下
//DataGrid
if (WebControl is System.Web.UI.WebControls.DataGrid)
...{
System.Web.UI.WebControls.DataGrid _control = WebControl as System.Web.UI.WebControls.DataGrid;
_control.DataSource = DataSource;
_control.DataBind();
}
//Repeater
else if (WebControl is System.Web.UI.WebControls.Repeater)
...{
System.Web.UI.WebControls.Repeater _control = WebControl as System.Web.UI.WebControls.Repeater;
_control.DataSource = DataSource;
_control.DataBind();
}
//DataList
else if (WebControl is System.Web.UI.WebControls.DataList)
...{
System.Web.UI.WebControls.DataList _control = WebControl as System.Web.UI.WebControls.DataList;
_control.DataSource = DataSource;
_control.DataBind();
}
//GridVIEw
else if (WebControl is System.Web.UI.WebControls.GridVIEw)
...{
System.Web.UI.WebControls.GridView _control = WebControl as System.Web.UI.WebControls.GridVIEw;
_control.DataSource = DataSource;
_control.DataBind();
}
}
catch ...{ }
}
#endregion
}
解說:spring屬性注入,因此該類中必須有一個相關的對象,我們使用接口的編程模式,定義了這個IAnnouncementManager m_AnnouncementManager接口,並使用該接口對象。好了,我們要在頁面初始化的時候顯示我們的符合條件的搜索結果,因此我做了個過程:DoShowAnnouncements。DOShowAnnouncements過程分2步完成:1、搜索出數據記錄:IList Announcements = m_AnnouncementManager.FindEntityListByNamedQueryOfRecord("GetAnnouncementsOfClassID", "101", 0, 10);2、數據綁定到頁面控件:WebControlDataBind(this.FSFindControl("FSPagerList"), Announcements);(該方法我是參照FastSpring底層的數據綁定方式進行改寫的,該方法比較通用,以後會考慮重載或者直接加入底層基類,以方便以後使用)。
四、ASPx頁面文件的修改,下面是所有代碼:
<%...@ Page Language="C#" MasterPageFile="~/FSMasterPage.master" AutoEventWireup="true" CodeFile="Index.ASPx.cs" Inherits="Index" Title="Untitled Page" %>
<ASP:Content ID="Content1" ContentPlaceHolderID="body" Runat="Server">
<form id="form1" runat="server" target="_top" method="post">
<div id="Div_Body" align="left">
<ASP:Repeater ID="FSPagerList" runat="server" EnableVIEwState="true">
<ItemTemplate>
<ul>
<li><a class="0" href="http://www.163.com" target="_blank">
<%...#DataBinder.Eval(Container.DataItem, "ClassID")%></a>
<a class="0" href="http://www.163.com" target="_blank">
<%...#DataBinder.Eval(Container.DataItem, "Title")%></a>
</li>
</ul>
</ItemTemplate>
</ASP:Repeater>
</div>
</form>
</asp:Content>解說:我從www.pconline.com.cn中的源碼看到,他們是使用div和table相結合的方式來顯示,我這裡就采用了div來進行顯示,有關div和table的頁面布局,可以自己去搜索相關的文章(粗略說一下:table是表格,用於顯示數據用,div才叫布局,如果整個頁面用table布局,那麼,它在table結束完它才會顯示頁面,用戶會覺得網站很慢,影響用戶的興致,而采用div布局,它處理數據是從頂部到底部一個個顯示出來的,可以在網速慢的情況看一下www.pconline.com.cn的網站就知道原因了,但是sina網站使用table布局,那有它們的原因的,我就不說了,自己可以去搜索相關的資料吧,可以搜索:“div table 區別”)。WebControlDataBind函數有2個參數,一個是需要綁定的頁面控件,一個是數據源,所以,這個aspx頁面中有一個Repeater對象的定義:<ASP:Repeater ID="FSPagerList" runat="server" EnableVIEwState="true">,至於這個頁面的代碼解說,我就不說了,我對Html代碼也不熟悉,我只是抄過來的哦。大家如果是一步步跟我學的,不知道能否正常運行,我怕有哪些地方遺留忘記說了,因為我也是新手,我還不能很熟悉整個流程,有缺少的地方,不能運行可以告訴我,我再改正一下。