SysUIDataView
为了解决展示数据的问题我们需要用到一个全新的客户端控件那就是SysUIDataView了简称DataView我们会用DataView替换掉上一篇文章中所说到的人手拼接HTML的部分用于迭代生成一个ul中的li元素因此看起来是把DataView当作Repeater来用实际上DataView的功能类似于ListView加上DetailsView
如果你把一个Array绑定到DataView上它会显示为一个ListView与ListView的LayoutTemplate相类似的是它也能够定义控件展示的整体布局并且仅仅是迭代输出其中的一小部分例如说编写一个有thead的table并且仅仅是迭代输出thead之后的tr在这方面是DataView和ListView完全一致的唯一不同的是客户端暂时还没有DataPager这样的控件所以DataView必须一次性的完整显示整个Array的数据
如果你把单个Object绑定到DataView上它就会显示为一个DetailsView这使得你可以使用两个DetailsView就做出经典的MasterDetails展示模式和在服务器端分别用ListView和DetailsView做出来的一样当然你不能指望DataView能够好像DetailsView那样自动帮你分析每一个数据项并映射出对应的HTML模板因此HTML模板还是要你自己手写的但至少那是在HTML中编写模板编写时能够享受IDE带来的各种好处维护时也更容易看懂自己(或别人)原来写下的HTML
JavaScript语法
接下来我们就要把DataView投入到实际应用中去了首先我们说一下如何用JavaScript来实例化一个DataView有编写ASPNET AJAX客户端代码经验的人对$create应该不会觉得陌生因为DataView继承自SysUIControl我们仍然可以用$create来实例化它不过在此之前我们先要把对应的HTML编写好
<ul id=
itemTemplate
class=
sysTemplate
>
<li>
<span class=award>{{ Award }}</span>
<span class=winner>{{ Winner }}</span>
<span class=film>{{ Film }}</span>
</li>
</ul>
然后我们就可以基于itemTemplate这个HTML元素创建控件了
$create(Sys
UI
DataView
{
dataSource: new SysDataAdoDataSource()
serviceUri: WebDataServicesvc
query: OscarWinners
} {} {} $get(itemTemplate));
现在页面显示出来的结果和之前我们人手拼接HTML的版本完全一致不过我们已经不在需要维护嵌入在JavaScript中的HTML代码了
声明性语法
如果你觉得上面的做法还不够好要在pageLoad()里面写一个$create那么声明性语法可能正是你需要的大家应该记得很久很久之前在ASPNET AJAX还叫做Atlas的时候就已经有过声明性语法的设计那就是xmlscript不知为何后来Microsoft放弃了这一设计现在声明性语法又回来了而且设计得比以前的xmlscript还要更好假如不用$create的话通过声明性语法实例化一个DataView仅需要这样做
<body
xmlns:sys=javascript:Sys
xmlns:dataView=javascript:SysUIDataView
sys:activate=*>
<ul id=itemTemplate class=sysTemplate
sys:attach=dataView
dataView:datasource={{ new SysDataAdoNetDataSource() }}
dataView:serviceuri=WebDataServicesvc
dataView:query=OscarWinners>
<li>
<span class=award>{{ Award }}</span>
<span class=winner>{{ Winner }}</span>
<span class=film>{{ Film }}</span>
</li>
</ul>
</body>
我们所需要更改的代码包括
在body元素上声明有关的xmlns将JavaScript中的名字空间映射到HTML上或者你可以理解为映射到XML/XHTML上
通过sys:activate=*这个声明让ASPNET AJAX知道它需要去解释页面上所有的声明性语法并激活对应的组件
将原本使用$create初始化时传递给实例的属性事件引用改为用声明性语法直接写在HTML元素的定义上
经过这三步我们就可以将原来使用$create创建的组件改为使用声明性语法创建了
小结
DataView使得我们能够使用HTML模板来避免手工拼接HTML带来的种种问题同时声明性语法让我们能够如同声明服务器端控件一样声明客户端组件虽然在ASPNET AJAX Preview 中这些功能仍有小bug例如我想用声明性语法创建我自己编写的InPlaceEditoBehavior这在初始化阶段毫无问题但却会在页面卸载销毁对象之时抛出脚本错误
由于我觉得ASPNET AJAX Preview 很快就要出来了所以我也就不准备去深入研究Preview 了等Preview 出来了再去好好看看源代码如果你有兴趣关注这方面的技术文章欢迎订阅我的博客点击侧栏上的订阅链接就可以了