0

我一直在四处寻找这样做的最佳选择。

基本上,我想将多个控件(文本框、下拉列表、复选框等)的两种方式数据绑定到自定义类/实体的单个实例,即: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 以便在这种类型的体系结构中检索和保存数据。

想法?

4

1 回答 1

1

asp:FormView 是 ASP.Net 中对单个实体进行声明性数据绑定的唯一方法吗?

还有DetailsView,但也有同样的问题。

我基本上已经放弃了 2-way 数据绑定。它非常适合原型制作,让我完成了 80-90% 的完整解决方案,但最后 10-20% 是一场噩梦。绑定任何重要的对象似乎总是涉及到如此多的事件处理程序来自定义行为,以至于我觉得它就像意大利面条代码。

我通常有两种方法:

MapEntityToView(entity)
MapViewToEntity(entity)

我调用它来分别显示实体和从页面填充。编写起来可能很乏味,但我不必为数据绑定问题而苦苦挣扎。

我确实将单向绑定广泛用于只读页面并在列表控件中显示项目。

于 2009-06-12T19:43:55.520 回答