我一直在寻找最佳选择。
基本上,我想对多个控件(文本框,下拉列表,复选框等)进行双向数据绑定到单个自定义类/实体实例,即: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 ='&lt;%#Bind(“EmployeeID”)%&gt;'字体松散,容易出现拼写错误
- 等等
所以我的第一个问题是,asp:FormView是ASP.Net中唯一一种对单个实体进行声明性数据绑定的方法吗?
其次,手动滚动某种双向绑定机制有多可行?我想它必须以反思为基础,但我可以忍受。关于如何在aspx页面中声明绑定关系的任何建议?适当的方式是这样的:
Text ='&lt;%#MySuperDuperBind(“EmployeeID”)%&gt;'
然后在某个地方(哪里?)我的MySuperDuperBind实现将在页面呈现时被调用....但是如何完成它有点超出我的意义。如果我想以只读方式呈现,我可以调用一个辅助函数,它将从表单中删除可编辑的UI控件,并将其替换为相应的只读版本(即:文本框替换为标签)。
另一种替代方法是远离网络表格并转向客户端模板解决方案,例如这个非常漂亮的解决方案:
http://weblogs.asp.net/dwahlin/archive/2009/05/03/using-jquery-with-client-side-data-binding-templates.aspx
但是,我不知道如何正确编写asp.net webservices以便在这种类型的架构中检索和保存数据。
想法?
答案 0 :(得分:1)
是一个asp:FormView的唯一方法 ASP.Net做声明性数据绑定 一个实体?
还有DetailsView,但它也有同样的问题。
我大多放弃了双向数据绑定。它非常适合原型设计,让我获得80-90%的完整解决方案,但最后10-20%是一场噩梦。绑定任何非平凡的对象似乎总是涉及如此多的事件处理程序来自定义行为,感觉像意大利面条代码给我。
我通常有两种方法:
MapEntityToView(entity)
MapViewToEntity(entity)
我打电话来显示实体并分别从页面填充。写作可能会很乏味,但我不必为数据绑定问题而努力。
对于只读页面和在列表控件中显示项目,我广泛使用单向绑定。