2009-06-29 12 views
2

Ich habe eine Klassenbibliothek erstellt, die mein Back-End-Objektmodell verfügbar macht. Ich möchte nicht direkt auf SQL oder XML zurückgreifen, wie eine überraschende Anzahl von Tutorials/Demos da draußen vermuten lässt.ASP.Net und bidirektionale Datenbindung

In meinem Page_Load() innerhalb der if (! IsPostbak), habe ich zur Zeit alle Werte meiner Kontrollen aus dem Objektmodell gesetzt, und rufen Sie DataBind() auf jeder Kontrolle.

Ich habe eine Schaltfläche Event-Handler, die ein Element aus dem Objektmodell (es ist eine Liste in diesem Fall) und bindet es an den Repeater. Zunächst einmal ist das unordentlich - jedesmal neu binden - aber noch wichtiger, es werden keine Werte angezeigt, wenn die Seite neu geladen wird. Sollte ich den Datenbindungscode außerhalb der if-Anweisung in PageLoad() einfügen?

Der zweite Teil der Frage bezieht sich auf die Rückkehr zu den Grundlagen - Was ist der beste Weg, um in Asp.net zu daten? Ich bin hauptsächlich daran interessiert, Listen und Arrays zu binden. Ich hätte mir vorgestellt, dass es eine Möglichkeit gibt, einem Steuerelement (z. B. TextBox) zu sagen, dass es an eine String-Variable bindet und dass der String immer den Inhalt des Textfelds widerspiegelt und das Textfeld immer den Inhalt des Strings widerspiegelt. Ich habe versucht, die <% # ...%> Syntax, aber nicht weiter als die Verwendung des Code-Behind wie oben beschrieben.

Ich habe mehrere Übersichten über Databinding gelesen, aber nichts da draußen scheint zu tun, was ich will - sie alle reden über die Verknüpfung von DataSets mit einer SQL-Datenbank!

Wenden Sie sich an das Wissen von StackOverflow.

Antwort

1

Sie müssen bei jeder Seitenladung eine Datenbindung durchführen, damit Sie den Code aus Ihrem! IsPostBack-Block entfernen müssen.

Wenn Sie eine Liste oder ein Array verwenden, behandeln Sie das Datenbindungsereignis auf dem Steuerelement. Für einen Repeater müssen Sie das ItemDataBound-Ereignis behandeln.

Dieses Beispiel wurde von http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx geändert:

<%@ 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> 

EDIT: Außerdem (und Sie bereits von dessen bewusst sein kann) Sie irgendwie Ihre Liste/Array bestehen bleiben müssen. Sie können den ganzen Weg zurück zur Datenbank gehen und die Liste dort neu erstellen oder Sie können sie im Speicher mit Cache, Viewstate oder Session als praktikable Optionen speichern, je nach Ihren Bedürfnissen.

0

Spring.NET Web werden Sie mit Zwei-Wege-Datenbindung mit schönen, einfach zu pflegen Code. Versuche es!