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






2.56/5 (12投票s)
2005年10月13日
2分钟阅读

50129

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>