对ASP.NET中的数据绑定感到困惑

时间:2009-07-30 17:36:36

标签: asp.net data-binding

假设我有一个对象

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

该对象是从工厂检索的(即不能使用SQLDataSource或类似的东西)

Person person = PersonFactory.GetPerson();

如何在Web表单上双向DataBind两个属性到Textboxes?我查看了FormView,但这似乎不符合我的需求,因为我没有迭代对象集合。当我尝试使用它时,我似乎没有在FormUpdated事件中的Person对象中获取已发布的值。而且我像这样绑定

标记

<asp:Textbox Text=<%# Bind("Name") %> />

背后的代码

 FormView1.DataSource = new List() { person };
 FormView1.DataBind();

我觉得我错过了一些非常明显的东西。我应该使用FormView吗?它似乎不适合简​​单的数据绑定,但&lt;#%Bind%&gt;方法必须在某种类型的容器中 - 是否有更合适的对象?

3 个答案:

答案 0 :(得分:1)

尝试在TextBox控件上调用DataBind方法。

protected override void OnLoad(EventArgs e)
{
     base.OnLoad(e);

     MyTextBox1.DataBind();
     MyTextBox2.DataBind();
}

我之前从未尝试过以这种方式进行双向绑定,但是使用Bind(“property”)语法,就我所知,它应该以这种方式工作。

如果调用DataBind方法不起作用,那么FormView是您最好的选择。

答案 1 :(得分:1)

您需要处理FormView的更新 - asp.net数据绑定控件中的更新不是自动的。我还考虑使用ObjectDataSource - 保持标记中的所有绑定可以使事情更容易找到。当您使用ObjectDataSource时 - 它会自动将您的单个对象包装在IEnumerable中,因此绑定到返回Person的方法是可以接受的。如果您不想写出yoruself表单,也可以考虑使用DetailsView。在您的情况下,您可以执行以下操作

<asp:FormView runat="server" DataSourceID="MyPersonDataSource"> ... </asp:FormView>
<asp:ObjectDataSource runat="server" ID="MyPersonDataSource" 
    TypeName="PersonFactory" DataObjectTypeName="Person" 
    SelectMethod="GetPerson" UpdateMethod="UpdatePerson" />

为方便起见,您需要在PersonFactory类上使用UpdateMethod(Person)方法。这样做可以消除您对代码隐藏的绑定,并允许您对person对象的更新持久保存到数据存储中,而无需自己处理更新事件。

答案 2 :(得分:-1)

DataBinder.Eval(Container.DataItem, "Name")

这应该可以解决问题,但我认为您需要对自己进行一些事件处理才能进行双向绑定。