我一直在努力为这个简单的问题找到一个清晰简洁的答案。
给定名为“SomeObj”的页面中的对象属性,是否可以像这样进行双向数据绑定:
<asp:TextBox ID="TextBox1" runat="server" Text="<%# SomeObj.SomeProperty %>" />
如果我们在Page_Load中调用“this.DataBind()”,这将在文本框中正确显示SomeProperty。但是,我的对象属性永远不会在回发期间写入 - 我做错了什么或者这实际上是不可能的?
我应该将此控件放在FormView或DetailsView等容器中吗?在页面生命周期的什么时候我应该能够看到我的对象属性被写入?
所有成千上万的复制粘贴教程都集中在列表和网格以及与Sql Data Sources的绑定上,我成功地使用了它们。但是对于一个简单的单个对象,肯定有一种方法不需要无关的容器,数据源和代码隐藏?
当然,在一个文本字段的代码隐藏中执行此操作的代码是微不足道的,但不再乘以属性和页面加载的负载。我改为编写了两个简单的例程,它们使用反射来自动加载带有属性值的控件,然后将控件值保存回属性。通过这些例程,我们可以使用这样的简单标记填充页面:
<asp:TextBox ID="SomeObj_SomeProperty" runat="server" />
通过简单地命名控件和对象属性一样,并在适当的时候调用我的两个方法,我得到双向数据绑定,代码隐藏除了创建主对象之外,其中只有很少的代码,而我不必将标记包装在其他控件中只是为了让数据绑定起作用。
我对ASP.NET不太熟悉,似乎我正在做一些应该已经为我做的事情。
更新
请注意,如果我尝试使用Bind()而得到通常的数据绑定异常,因为没有像列表或网格视图那样的特殊数据绑定控件:
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("SomeObj.SomeProperty") %>' />
给出了这个错误:
Databinding methods such as Eval(), XPath(), and Bind() can only be used
in the context of a databound control.