程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> FastSpring學習筆記五(Web頁面顯示)

FastSpring學習筆記五(Web頁面顯示)

編輯:.NET實例教程

一、我們用之前的例子作為基礎,現在做一個符合下面條件的查詢並顯示出來:1、IsActive=1(激活狀態)。2、ClassID=參數。3、按CreatedDate和Priority進行降序排列。因此我們在Announcement.hbm.XML中加入我們的搜索信息(為何是加在這裡?因為它是使用NHibernate來進行查詢的),下面是Announcement.hbm.XML的完成代碼:



<?XML version="1.0" encoding="utf-8" ?>
<hibernate-mapping XMLns="urn:nhibernate-mapping-2.2">
  <class name="DZ_Portal.App.Model.Announcement,DZ_Portal.App" table="PT_Announcement" lazy="false">

    <id name="ItemID" column="ItemID" type="Int32" unsaved-value="0">
      <generator class="native"/>
    </id>
    <property column="ModuleID" type="Int32" name="ModuleID" />
    <property column="CreateByUser" type="String" name="CreateByUser" not-null="true" length="50" />
    <property column="CreatedDate" type="DateTime" name="CreatedDate" not-null="true" />
    <property column="Title" type="String" name="Title" not-null="true" length="100" />
    <property column="MoreLink" type="String" name="MoreLink" not-null="true" length="150" />
    <property column="ExpireDate" type="DateTime" name="ExpireDate" not-null="true" />
    <property column="Description" type="String" name="Description" not-null="true" length="2147483647" />
    <property column="Frequency" type="Int32" name="Frequency" not-null="true" />
    <property column="IsActive" type="Int32" name="IsActive" not-null="true" />
    <property column="Priority" type="Int32" name="Priority" not-null="true" />
    <property column="ClassID" type="Int32" name="ClassID" not-null="true" />

  </class>

  <query name="GetAnnouncementsOfClassID">
    <![CDATA[from Announcement announcement WHERE announcement.IsActive=1 AND announcement.ClassID=:param1 ORDER BY announcement.CreatedDate DESC,announcement.Priority DESC]]>
  </query>

</hibernate-mapping>
<!--1。HBM映射配置文件中“urn:nhibernate-mapping-2.0 ”需改為“urn:nhibernate-mapping-2.2”

2。 <class name="類名,程序集名" table="Archives" >需改為<class name="類名,程序集名
" table="Archives" lazy="false">,需要添加“lazy="false"”,不然會出現錯誤:
he following types may not be used as proxIEs: xxxxx: method get_CreateDate should be virtual

3。Spring.Data.NHibernate程序集變更為:Spring.Data.NHibernate12 (注意:Spring.Data.NHibernate
程序集仍然存在,是對NHibernate1.0X的支持,Spring.Data.NHibernate12 為新增的支持NHibernate1.2.0GA的程序集)
-->

 二、查詢工作屬於業務邏輯層,因為你的業務就是負責顯示最新有用的新聞消息,所以你必須要有一個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(&quot;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">
    &nbsp;<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代碼也不熟悉,我只是抄過來的哦。大家如果是一步步跟我學的,不知道能否正常運行,我怕有哪些地方遺留忘記說了,因為我也是新手,我還不能很熟悉整個流程,有缺少的地方,不能運行可以告訴我,我再改正一下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved