我一直在四处寻找这样做的最佳选择。
基本上,我想将多个控件(文本框、下拉列表、复选框等)的两种方式数据绑定到自定义类/实体的单个实例,即:Person。
看来,(唯一?)这样做的方法是使用这样的:
<asp:FormView ID="FormView1" runat="server" DataKeyNames="OrderID"
DataSourceID="SqlDataSource1" DefaultMode="Edit">
<EditItemTemplate>
OrderID:
<asp:Label ID="OrderIDLabel1" runat="server" Text='<%# Eval("OrderID") %>' />
<br />
CustomerID:
<asp:DropDownList ID="CustomerIDDropDownList" runat="server"
DataValueField='CustomerID' DataSourceID="CustomerDataSource"
DataTextField="CompanyName"
SelectedValue='<%# Bind("CustomerID") %>'
/>
EmployeeID:
<asp:TextBox ID="EmployeeIDTextBox" runat="server"
Text='<%# Bind("EmployeeID") %>' />
<br />
一些问题:
- 这仅限于使用 ObjectDataSource 控件(即:不能只在后面的代码中使用所需类的实例)
- 强制您定义第二个(可能相同的布局)只读模板......如果有一些机制可以智能地呈现从编辑模板派生的只读视图,那就太好了。
- 绑定声明 Text='<%# Bind("EmployeeID") %>' 类型松散,因此容易出现拼写错误 - 等等
所以我猜我的第一个问题是,asp:FormView 是 ASP.Net 中对单个实体进行声明性数据绑定的唯一方法吗?
其次,手动滚动某种双向绑定机制有多可行?我想它必须是基于反射的,但我可以忍受。关于如何在 aspx 页面中声明绑定关系的任何建议?正确的方法是:
Text='<%# MySuperDuperBind("EmployeeID") %>'
然后在某个地方(在哪里?)我的 MySuperDuperBind 实现将在页面呈现时被调用....这是如何完成的有点超出我的理解。如果我想以只读方式呈现,我可以调用一个辅助函数,该函数将从表单中删除可编辑的 UI 控件并将其替换为相应的只读版本(即:将文本框替换为标签)。
另一种替代方法是远离网络表单并使用客户端模板解决方案,例如这个非常漂亮的解决方案:
http ://weblogs.asp.net/dwahlin/archive/2009/05/03/using-jquery-with-客户端数据绑定模板.aspx
但是,我不知道如何正确编写 asp.net webservices 以便在这种类型的体系结构中检索和保存数据。
想法?