2009-06-29 5 views
2

Я создал библиотеку классов, которая предоставляет мою объектную модель. Я не хочу привязывать прямую привязку к SQL или XML, так как удивительное количество учебников/демонстраций там, кажется, предполагает.ASP.Net и двусторонняя привязка данных

В моей странице_Load(), в if (! IsPostbak), я в настоящее время устанавливаю все значения моих элементов управления из объектной модели и вызываю Databind() для каждого элемента управления.

У меня есть обработчик событий кнопки, который удаляет элемент из объектной модели (это список в этом случае) и переустанавливает его на ретранслятор. Прежде всего, это беспорядочно - каждый раз переупорядочивая - но что более важно, при повторной загрузке страницы значения не отображаются. Должен ли я поместить код привязки данных за пределы оператора if в Page_Load()?

Вторая часть вопроса касается возврата к основам - какой лучший способ для привязки данных в Asp.net? В основном я заинтересован в привязке к спискам и массивам. Я бы предположил, что есть способ сообщить элементу управления (например, TextBox) привязку данных к строковой переменной, а строка всегда будет отображать содержимое текстового поля, а текстовое поле всегда будет отображать содержимое строки. Я пробовал синтаксис <% # ...%>, но не получил ничего, кроме использования кода, как описано выше.

Я прочитал несколько обзоров привязки данных, но ничего там, кажется, не делает то, что я хочу - все они говорят о привязке DataSets к базе данных 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> 

EDIT: Кроме того, (и вы, возможно, уже знают об этом), вы должны будете упорствовать свой список/массив как-то. Вы можете вернуться к базе данных и восстановить список там, или вы можете сохранить его в памяти с кешем, виджетатом или сеансом в качестве жизнеспособных вариантов в зависимости от ваших потребностей.

0

Spring.NET Web предоставит вам двухстороннюю привязку данных с приятным, простым в обслуживании кодом. Попробуй!

Смежные вопросы