65.9K
CodeProject 正在变化。 阅读更多。
Home

无需编写代码即可绑定业务对象

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.56/5 (12投票s)

2005年10月13日

2分钟阅读

viewsIcon

50129

downloadIcon

428

迄今为止的其他示例都使用了更多的代码,手动处理事件,或使用数据集等。

引言

System.Web.UI.WebControls.ObjectDataSource 类允许开发人员自动将业务对象的公共属性绑定到控件,例如 DetailsView 控件。

这本应该很简单,但经过一周的研究,包括通过 Microsoft 的托管新闻组获得的支持,至今还没有等效的示例。例如,MS 坚持认为开发人员至少必须编写一个事件处理程序来处理每个绑定的属性,但附带的示例证明这并非必要。

安装

该示例是一个基于文件系统的网站。解压缩它,并将其作为现有网站添加到解决方案中。设置启动页。启动调试器。

业务对象

对象数据绑定确实要求业务对象具有选择和更新方法,但此示例不需要将每个属性作为单独的参数传递给该更新方法。此示例中的更新方法将其唯一参数作为对象,该对象的属性已使用 DetailsView 控件中的当前值自动更新。更新方法将对象放置在 Session 中,因为在应用程序域的其他地方(在更新方法之外),更新后的值将只能以 DetailsView 中的集合形式访问,或者根本无法访问(甚至在 DetailsView 中也无法访问)。

// Data Object a.k.a. Business Object


public class DO
{
  private string _ID;
  private bool _IsTest;
  public string ID { get { return _ID; } set { _ID = value; } }
  public bool IsTest { get { return _IsTest; } set { _IsTest = value; } }
  public DO()
  {
    ID = "Test";
    IsTest = false;
  }
  // does not have to be static

  public static DO Select()
  {
    DO obj = (DO)HttpContext.Current.Session["DO"];
    if (obj == null) obj = new DO();
    return obj;
  }
  public void Update(DO obj)
  {
    HttpContext.Current.Session["DO"] = obj;
  }

}

CodeBehind

如果开发人员正在编写按钮的事件处理程序,并且需要获取其属性包含屏幕上当前值的业务对象,则对 DetailsView.UpdateItem 的调用将强制调用更新方法,并将其传递一个更新后的对象。然后,开发人员可以使用 Select 方法检索更新后的对象。

public partial class DOTest : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
  }
  protected void btnRunTest_Click(object sender, EventArgs e)
  {
      // update the data object with the values currently on screen

      DetailsView1.UpdateItem(true);
      // retrieve the updated object

      DO obj = DO.Select();

      // do something useful with the updated object

  }
}

ASPX 页面

该页面包含一个 Button、一个 ObjectDataSource 和一个 DetailsView 控件。下面的 ASPX 文件内容由设计器自动生成。

<body>
  <form id="form1" runat="server">
  <div> </div>
  <asp:Button ID="btnGetRate" runat="server" 
      Height="44px" OnClick="btnRunTest_Click"
      Style="z-index: 100; left: 208px; position: absolute; top: 72px" 
      Text="Run Test" Width="73px" />
  <asp:DetailsView ID="DetailsView1" 
      runat="server" DataSourceID="ObjectDataSource1"
      DefaultMode="Edit" Height="50px" 
      Style="z-index: 101; left: 192px; position: absolute;
      top: 160px" Width="125px" AutoGenerateRows="False">
    <Fields>
      <asp:BoundField DataField="ID" 
         HeaderText="ID" SortExpression="ID" />
      <asp:CheckBoxField DataField="IsTest" 
         HeaderText="IsTest" SortExpression="IsTest" />
    </Fields>
  </asp:DetailsView>
  <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
      SelectMethod="Select" TypeName="DO" 
      UpdateMethod="Update" DataObjectTypeName="DO">
  </asp:ObjectDataSource>
  </form>
</body>

您也可以手动定义模板字段,如下所示

(请注意,某些示例,包括来自 MS 的示例代码使用 Eval 代替 Bind,因此发送到更新方法的业务对象将不包含更新后的值。)

<Fields>
  <asp:TemplateField HeaderText="ID">
    <ItemTemplate>
      <asp:TextBox ID="tbID" runat="server" Text='<%# Bind("ID") %>' />
    </ItemTemplate>
  </asp:TemplateField>
  <asp:TemplateField HeaderText="IsTest">
    <ItemTemplate>
      <asp:CheckBox ID="cbIsTest" 
          runat="server" Checked='<%# Bind("IsTest") %>'/>
    </ItemTemplate>
  </asp:TemplateField>
</Fields>
© . All rights reserved.