6

假设我们有一个对象

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

4

5 回答 5

7

可悲的是,但 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();
于 2011-09-16T10:06:48.503 回答
0

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

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

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

于 2011-09-21T08:20:00.760 回答
0

在 OnInit 中,您总是使 null .. 删除这些代码并保持页面加载..

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

页面加载(){

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

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

}

于 2011-09-15T10:21:53.863 回答
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');
于 2014-08-06T19:19:31.757 回答
0

我为此创建了一个解决方案。

https://www.codeproject.com/Articles/146078/WPF-Two-way-Databinding-in-ASP-NET-Enabling-MVVM

或github:

https://github.com/Recodify/mvvm-4-asp-webforms

于 2017-09-14T09:42:16.497 回答