ASP.Net和双向数据绑定

时间:2009-06-29 16:16:05

标签: asp.net data-binding

我已经创建了一个暴露我的后端对象模型的类库。我不希望直接将数据绑定到SQL或XML,因为有大量的教程/演示似乎在假设。

在我的Page_Load()中,在if(!IsPostbak)中,我当前从对象模型中设置了我的控件的所有值,并在每个控件上调用Databind()。

我有一个按钮事件处理程序,它从对象模型中删除一个项目(在这种情况下它是一个List)并将其重新绑定到Repeater。首先,这很麻烦 - 每次重新绑定 - 但更重要的是,页面重新加载时不会显示任何值。我应该将数据绑定代码放在Page_Load()中的if语句之外吗?

问题的第二部分是关于回归基础 - 在Asp.net中数据绑定的最佳方法是什么?我主要对列表和数组的绑定感兴趣。我想象有一种方法可以告诉控件(例如TextBox)数据绑定到字符串变量,并且字符串总是反映文本框的内容,文本框总是反映字符串的内容。我试过<%#...%>语法,但没有比使用上面描述的代码隐藏更多。

我已经阅读了几个关于数据绑定的概述,但似乎没有任何东西可以做我想要的 - 他们都谈论将DataSet连接到SQL数据库!

转向StackOverflow的知识。

2 个答案:

答案 0 :(得分: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>

编辑: 另外,(你可能已经意识到这一点)你需要以某种方式持久保存你的列表/数组。您可以一直返回数据库并在那里重新构建列表,也可以根据需要将缓存,视图状态或会话存储在内存中作为可行选项。

答案 1 :(得分:0)

Spring.NET Web将为您提供具有良好,易于维护的代码的双向数据绑定。试一试!