【问题标题】:Two way databinding in ASP.NETASP.NET 中的两种方式数据绑定
【发布时间】:2011-11-17 17:31:34
【问题描述】:

假设我们有一个对象

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 后重新加载页面时在属性中包含这些值,但属性始终为空。

【问题讨论】:

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


    【解决方案1】:

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

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

    Page_Load() {

    if(!Page.IsPostBack)
    {
         if (EntityObject== null) 
                EntityObject= new EntityObject(); 
    
            FormView.DataSource = new[] { EntityObject }; 
            FormView.DataBind(); 
     }
    

    }

    【讨论】:

    • 这似乎很有帮助,现在输入的值在回发后保留,但是当我访问 EntityObject 时它仍然有所有空值
    【解决方案2】:

    遗憾的是,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();
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 据我所知,gridview 适合显示和编辑在底层数据源中表示为 DataTable 的数据行,但我需要显示某种必须绑定到业务对象的表单,这是不支持的,因为网络是无状态的)
      【解决方案4】:

      对于那些寻找的人,我制作了这个 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');
      

      【讨论】:

        【解决方案5】:
        猜你喜欢
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多