ASP.NET AJAX 4.0 模板编程 - 第二部分






4.33/5 (3投票s)
本文描述了 ASP.NET AJAX 4.0 客户端模板编程中的实时数据绑定。
本文的源代码可从 http://udooz.net/index.php?option=com_docman&task=doc_download&gid=2&Itemid=5 下载。
本文是 ASP.NET AJAX 4.0 模板编程第一部分 的续篇。在本文中,我将解释 ASP.NET AJAX 4.0 模板中不同的数据绑定选项。简单回顾一下,我使用了 ADO.NET 数据服务来获取 AdventureWorks 的 Product 表记录。在本文中,我将解释如何从客户端更新/添加新记录。
绑定
模板支持以下绑定方式
- 一次性 - 表达式仅在模板渲染时计算一次。
- 单向实时绑定 - 如果数据源中的项发生更改,则计算表达式并更新值。
- 双向实时绑定 - 如果数据源值发生更改,则更新表达式中的值。如果表达式中的值发生更改,它也会更新数据源。
下图描绘了绑定过程。

在上图中,红色虚线箭头表示一次性数据绑定。一旦 DataView 通过 AdoNetDataContext 获取了数据源中的数据。单向实时绑定显示为紫色阴影箭头。此阴影的目的是,无论何时数据源中的数据更新,都会通过 AdoNetDataContext 更新到 DataView。双向实时绑定显示为绿色阴影双向箭头。在这种情况下,数据上下文应了解数据源上的更新操作,并提供一个接口供 DataView 发送修改后的值。
通过这三种绑定方式,ASP.NET AJAX 提供了以下表达式约定:
- {{
}} - 一次性(可用于任何 HTML 控件,例如 <p>{{ Name }}</p>) - { 绑定
} - 单向,如果不是用户输入的 HTML 控件,例如 <td>{ binding Name } </td> - {binding
} - 双向,如果是 INPUT HTML 控件,例如 <input type="text" sys:value="{{ binding Name }}" />
主从布局
<body xmlns:sys="javascript:Sys"
xmlns:dataview="javascript:Sys.UI.DataView"
sys:activate="*">
<form id="form1" runat="server">
<div>
<!--Master View-->
<ul sys:attach="dataview" class=" sys-template"
dataview:autofetch="true"
dataview:dataprovider="{{ dataContext }}"
dataview:fetchoperation="Products"
dataview:selecteditemclass="myselected"
dataview:fetchparameters="{{ {$top:'5'} }}"
dataview:sys-key="master"
>
<li sys:command="Select">{binding Name }</li>
</ul>
<!--Detail View-->
<div class="sys-template"
sys:attach="dataview"
dataview:autofetch="true"
dataview:data="{binding selectedData, source={{master}} }">
<fieldset>
<legend>{binding Name}</legend>
<label for="detailsListPrice">List Price:</label>
<input type="text" id="detailsListPrice"
sys:value="{binding ListPrice}" />
<br />
<label for="detailsWeight">Weight:</label>
<input type="text" id="detailsWeight" sys:value="{binding Weight}" />
<br />
</fieldset>
<button onclick="dataContext.saveChanges()">Save Changes</button>
</div>
</div>
</form>
</body>
可选择且可编辑
无序列表显示了主从详情,此处为产品名称(第 15 行)。此行还表明列表项是可选择的,使用 sys:command="Select"
。为了维护主从关系或可选择项,需要指定主键。DataView 的 sys-key
属性引用了主键。在此示例中,我将主键称为“master
”(第 13 行)。此外,您还可以看到我使用 DataView 的 fetchparameter
属性传递了一个过滤器选项(第 12 行)。在此示例中,我使用其过滤器语法要求 ADO.NET 数据服务仅提供前五条记录。
当主列表中选择了一个项目时,详细信息视图需要被通知。详细信息视图的组件和绑定详细信息应使用常规的 sys:attach="dataview"
和 DataView 的 data 属性进行标识。在此示例中,dataview:data="{binding selectedData, source={{master}} }"
指定了与 sys-key
名称为“master
”的 DataView 进行绑定。fieldset
用于显示产品的一组值。在此,可以编辑列表价格和重量。
一旦某个项目被编辑,就需要通过数据上下文通知数据源。标题为“保存更改”的按钮指定了每当单击此按钮时,都通过数据上下文的 saveChanges()
方法将详细信息视图中的项目保存到数据源。相应的数据源的更新选项应在数据上下文的 set_saveOperation()
上设置。以下 JavaScript 代码对此进行了说明。
var dataContext = new Sys.Data.AdoNetDataContext();
dataContext.set_serviceUri("AWProductDataService.svc");
dataContext.set_saveOperation("Products(master)");
dataContext.initialize();
ADO.NET Product 数据服务的 Products(id) 方法用于 set_saveOperation。当使用产品主键作为参数调用 ADO.NET 数据服务的 Product 服务时,可以更新一个项目。此处,我再次将主布局的“master” sys-key 引用为 Product 的主键。
上述代码的输出是

上面一个是主视图,其中 Sport-100 Helmet, Red 被选中,下面的页面显示了详细信息。您可以编辑和更新数据源。
DataView 的 selecteditemclass 属性用于以不同的样式显示选定的项目。
.myselected {
color: white;
font-weight: bold;
background-color: Silver;
}