2009-06-29 61 views
2

我創建了一個公開我的後端對象模型的類庫。我不想直接將數據綁定到SQL或XML,因爲這裏有大量的教程/演示似乎假設。ASP.Net和雙向數據綁定

在我的Page_Load()中,在if(!IsPostbak)中,我當前從對象模型中設置了我的控件的所有值,並在每個控件上調用Databind()。

我有一個按鈕事件處理程序,它從對象模型中刪除一個項目(在這種情況下它是一個List)並將其重新綁定到Repeater。首先,這是混亂 - 每次重新綁定 - 但更重要的是,頁面重新加載時不顯示任何值。我應該將數據綁定代碼放在Page_Load()中的if語句之外嗎?

問題的第二部分是關於迴歸基礎知識 - 在Asp.net中數據綁定的最佳方式是什麼?我主要感興趣的是綁定列表和數組。我會想象有一種方法可以告訴控件(例如TextBox)將數據綁定到一個字符串變量,並且該字符串總是反映文本框的內容,而文本框總是反映該字符串的內容。我嘗試了<%#...%>語法,但沒有比上面描述的使用代碼隱藏功能更進一步。

我已經閱讀了數據綁定的幾個概述,但沒有什麼似乎做我想做的 - 他們都談論將數據集鏈接到SQL數據庫!

談談StackOverflow的知識。

回答

1

您需要對每個頁面加載數據綁定,因此您需要從您的!IsPostBack塊中刪除代碼。

使用列表或數組處理控件上的數據綁定事件時。對於中繼器,您需要處理ItemDataBound事件。

這個例子已經從http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx修改:

<%@ Page Language="C#" AutoEventWireup="True" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html > 
<head> 
    <title>OnItemDataBound Example</title> 
<script language="C#" runat="server"> 
     void Page_Load(Object Sender, EventArgs e) { 
      ArrayList values = new ArrayList(); 

      values.Add(new Evaluation("Razor Wiper Blades", "Good")); 
      values.Add(new Evaluation("Shoe-So-Soft Softening Polish", "Poor")); 
      values.Add(new Evaluation("DynaSmile Dental Fixative", "Fair")); 

      Repeater1.DataSource = values; 
      Repeater1.DataBind(); 
     } 

     void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 

      // This event is raised for the header, the footer, separators, and items. 

      // Execute the following logic for Items and Alternating Items. 
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 

      if (((Evaluation)e.Item.DataItem).Rating == "Good") { 
       ((Label)e.Item.FindControl("RatingLabel")).Text= "<b>***Good***</b>"; 
      } 
      } 
     }  

     public class Evaluation { 

      private string productid; 
      private string rating; 

      public Evaluation(string productid, string rating) { 
      this.productid = productid; 
      this.rating = rating; 
      } 

      public string ProductID { 
      get { 
       return productid; 
      } 
      } 

      public string Rating { 
      get { 
       return rating; 
      } 
      } 
     } 

    </script> 

</head> 
<body> 

    <h3>OnItemDataBound Example</h3> 

    <form id="form1" runat="server"> 

     <br /> 
     <asp:Repeater id="Repeater1" OnItemDataBound="R1_ItemDataBound" runat="server"> 
      <HeaderTemplate> 
      <table border="1"> 
       <tr> 
        <td><b>Product</b></td> 
        <td><b>Consumer Rating</b></td> 
       </tr> 
      </HeaderTemplate> 

      <ItemTemplate> 
      <tr> 
       <td> <asp:Label Text='<%# DataBinder.Eval(Container.DataItem, "ProductID") %>' Runat="server"/> </td> 
       <td> <asp:Label id="RatingLabel" Text='<%# DataBinder.Eval(Container.DataItem, "Rating") %>' Runat="server"/> </td> 
      </tr> 
      </ItemTemplate> 

      <FooterTemplate> 
      </table> 
      </FooterTemplate> 

     </asp:Repeater> 
     <br /> 

    </form> 
</body> 
</html> 

編輯: 此外,(你可能已經意識到了這一點),你需要以某種方式繼續存在列表/陣列。您可以一路回到數據庫並在那裏重新構建列表,或者根據您的需要將其存儲在內存中,將緩存,視圖狀態或會話視爲可行選項。

0

Spring.NET Web將爲您提供雙向數據綁定,具有漂亮,易於維護的代碼。試一試!