2009-09-19 67 views
9

如何維護ASP.NET頁面發佈後備之間的對象?我有一個ASP.NET網頁。當我點擊一個asp.net按鈕時,我會調用我的函數(Save),它將創建我的自定義類(UserDetails類)的對象並將詳細信息保存到數據庫。所以這是一個回帖。回帖後,相同的頁面將顯示給用戶。那時候,我想把我在第一個函數(保存)中創建的用戶對象。做這個的最好方式是什麼 ?我知道我可以將它存儲在會話中並訪問它。但我想知道有沒有其他更好的方法?ASP.NET:我如何在回發之間維護對象?

回答

3

你正在尋找的方法是某種類型的數據綁定機制,結合對象的值(你可以從加載數據庫,如果它已經存在)到您的asp.net webform。

基本上你具備以下條件:

  1. 您顯示與領域爲對象的屬性,一個空的網頁表格(即文本框)
  2. 用戶將填寫的表格,按保存
  3. 然後回發將發生。在PageLoad上,您可以檢測這是否爲Page.IsPostback的回傳,如果是,則創建一個新對象並用用戶輸入的值填充它。
  4. 在您的按鈕的OnClick,你調用相應的BL方法儲存下來的DB

這看起來像(我寫出來我的頭沒有一個編譯器,所以要小心:))

public partial class MyPage : Page 
{ 

    private Person myPersonObj; 

    protected void Page_Load(...) 
    { 

     if(!Page.IsPostback) 
     { 
      //this is not a postback, so you may load an object based on an ID (i.e. in QueryString or create a new one 
      myPersonObj = new Person(); 
     } 
     else 
     { 
      //it is a postback, so unbind the values 
      myPersonObj = new Person(); 
      Unbind(); //the myPersonObj will be filled, the values are managed by ASP.net in the ViewState 
     } 

    } 

    //caution, overriding Page.DataBind() 
    private override void DataBind() 
    { 
     textBoxFirstname.Text = myPersonObj.FirstName; 
     ... 

    } 

    private void Unbind() 
    { 
     myPersonObj.FirstName = textBoxFirstname.Text; 
    } 

    protected void btnSubmit_OnClick(...) 
    { 
     if(Page.IsValid) 
     { 
      Save(); 
     } 
    } 

    private void Save() 
    { 
     //ideal layering with Interfaces 
     IPersonBL personBL = MyBLFactory.Get<IPersonBL>(); 
     personBL.SavePerson(myPersonObj); //call the BL for further validation and then persisting 
    } 
} 

我想要的東西添加昨天,卻忘了,因爲我不得不趕快:
您可以將對象以及存儲在ViewState或會話爲他人所描述的,但我已經經歷了它應該由於以下「缺點」(從我的觀點來看)儘可能少:

  • 你的對象必須是可序列化
  • 在ViewState中存儲將drammatically增加你的頁面的大小,從而放慢您的網頁的加載速度。請注意,每次發生「回發」時,ViewState都會傳輸到客戶端並返回。如果這是唯一的可能性,你遇到性能問題,你可能會考慮trying this(但這應該是例外!!)
  • 在會話中存儲對象可能會把負載放在服務器端,消耗那裏的內存。如果你知道你不再需要它們,你應該小心地將對象存儲在會話中,並且可能還要關心那些對象的銷燬。

我描述的「數據綁定」方法的優點是,您沒有這些問題,每次都有一個新的新對象的「缺點」。因此,您必須注意處理您的對象狀態,即手動保持id通過往返等。

3

您可以將對象存儲在ViewState中,這將是頁面特定的存儲。該對象將被序列化並注入頁面視圖狀態,這將使頁面更大。

通過在會話中存儲對象,您可以保持頁面更小但消耗服務器內存資源。

或者,您可以每次從數據庫中讀取對象。這將具有顯示數據庫中保存的內容的優點。

7

另一種選擇是使用唯一密鑰(例如「user」+ id)將對象存儲在緩存中,並且只將其存儲在當前會話中或ViewState中。在回發期間,您可以從緩存中檢索對象。

有了這個方法,你有幾個優點:

  • 你在你的會話或在ViewState
  • 如果回發是由具有較少的數據,你只需要訪問數據庫,如果對象是無在緩存
  • 如果沒有回發製成,對象最終會從緩存中刪除較長(釋放內存)
-1

在UI執行此

UserDetail userDetail = new UserDetail(); 
    //do your stuff 
    userDetail = UserBL.TransferUserData(userDetail); 

    //do your stuff 

在BL

public static UserDetail TransferUserData(UserDetail userDetail) 
{ 
    // do your processing on userDetail 
    return UserDAL.TransferUserData(userDetail); 
} 

在DAL

public static UserDetail TransferUserData(UserDetail userDetail) 
{ 

    //do your processing of db 
    return userDetail; 
}