ASP.NET中的双向数据绑定

时间:2011-09-15 09:34:11

标签: c# .net asp.net data-binding 2-way-object-databinding

假设我们有一个对象

class Entity
{
    public string ID {get; set;}
    public string Name {get; set;}
}

我想将属性绑定到页面上的两个文本框:

<asp:FormView ID="FormView" runat="server">
  <ItemTemplate>
    <asp:textbox ID="TextId" Text='<%# Bind("ID") %>'/>
    <asp:textbox ID="TextId" Text='<%# Bind("Name") %>'/>
  </ItemTemplate>
</asp:FormView>

然后在代码中写下

public EntityObject
{
    get { return ViewState["Entity"] as Entity; }
    set { ViewState["Entity"] = value; }
}

protected override void OnInit(EventArgs e)
{
    if (EntityObject== null)
        EntityObject= new EntityObject();

    FormView.DataSource = new[] { EntityObject };
    FormView.DataBind();
    base.OnInit(e);
}

当我在文本框中输入值时,我希望EntityObject在PostBack之后重新加载页面时在属性中包含这些值,但属性始终为null。

5 个答案:

答案 0 :(得分:5)

可悲的是,但ASP.NET不支持双向绑定到.net对象...... 相反,你可以在每个帖子上使用类似“手动绑定”的东西(这里AddIncomeSources是RepeaterControl)

public List<Income> AdditionalIncomeList 
{
    get { return ViewState["AdditionalIncome"] as List<Income>; }
    set { ViewState["AdditionalIncome"] = value; }
} 

foreach (RepeaterItem item in AddIncomeSources.Items)
{
    var amount = (TextBox)item.Controls.Cast<Control>().First(c => c.ID == "Amount");
    var document = (DropDownList)item.Controls.Cast<Control>().First(c => c.ID == "Document");
    AdditionalIncomeList[item.ItemIndex].Amount = amount.Text.ToDouble();
    AdditionalIncomeList[item.ItemIndex].IncomeDocument = document.SelectedValue;
}

AddIncomeSources.DataSource = AdditionalIncomeList;
AddIncomeSources.DataBind();

答案 1 :(得分:0)

在OnInit中,你总是将其设为null ..删除这些代码并保持页面加载..

只需要在第一次绑定而不是在所有回发中。

的Page_Load() {

if(!Page.IsPostBack)
{
     if (EntityObject== null) 
            EntityObject= new EntityObject(); 

        FormView.DataSource = new[] { EntityObject }; 
        FormView.DataBind(); 
 }

}

答案 2 :(得分:0)

这里的问题是你正在尝试创建动态控制。

你可以在.aspx页面中使用gridview控件并绑定数据,默认情况下它是viewstate而不是你的..

无论如何,web是无状态的,我们应该通过ViewState或Session或Application保留数据。你也可以将它保存在缓存中但不可靠(我们可以使它在实用上可靠)。大多数.NET控件都内置了ViewState。

答案 3 :(得分:0)

对于那些看起来,我制作了这个javascript插件。它的数据绑定非常接近WPF所做的并且易于使用。它在.txt文件中附加了文档

https://github.com/jdemeuse1204/ObjectDataBinding

以下是我的一个绑定看起来像

的示例
<input runat="server" class="popoutEditInput" style="width: 50px;" data-bind="path: Quote" />

要激活你,请致电

$("#yourelementname").observe(yourobject, 'yourbindingname');

要恢复对象以进行保存或其他操作

var object = $("#yourelementname").getObserveObject('yourbindingname');

答案 4 :(得分:0)