这两天一直在寻找Windows Mobile 6.5 Widget如何进行数据访问,前面的一篇文章我说了可以使用XML作为数据交换进行远程的数据存储,当然Widget只是轻量级的东西,如果做的很复杂的话就不好了,所以今天这里我就说一下如何使用AJAX4,ADO.NET Data Service和Entity Framework进行数据访问,我估计大家看这个都会觉得有点头晕,没错,我头也晕,今天和国外的一个WM MVP讨论了一下这个事情,觉得这个让一个本来轻量的Widget变得更加复杂了,如果是XML的话,会简单很多,但是速度我很难保证。。
好了,话不多说,和朋友讨论之后就把他的文章直接翻译过来,当然,如果你有条件的话本地制作也是可以的,因为我本身没有Entiry Framework并且也安装不了,不过我运行了代码之后是完全可以运行的,所以说理论上没有任何问题。最后题外一下,微软发布东西可真够勤奋的,弄的我们开发人员很累,而且这些东西还不是最好用的。这里提醒一下,这里所用的几个技术现在还都是Preview版本,以后有什么更改我可不敢保证。
我们首先需要创建一个项目,我们可以使用VS进行项目的创建并删除掉Web.config和Default.aspx,因为这些是不需要的,然后我们可以创建一个基本的WM 6.5 Widget结构,如果你现在还不会,可以看看这篇文章,基础的讲解Windows Mobile 6.5 Widget的组成结构,OK,现在如果我们创建好了结构之后,就是创建数据了。
现在我们创建一个Entity Data Model以便和数据进行互动,选择添加新项,然后选择【ADO.NET Entity Data Model】,然后这里我们给他命名为AdventureWorksModel.edmx。通过Entity Data Model向导,特别是数据库连接,当创建完成后,选择Produce和ProductCategory两张表,其他的我们可以不用管,如果选择好了之后我们就可以看到下图了。

当我们做完了之后我们就要创建一个ADO.NET Data Service模板,这里我们创建一个名为AdventureWorksData.svc的模板。当我们做完了之后我们就要创建一个ADO.NET Data Service模板,这里我们创建一个名为AdventureWorksData.svc的模板。一旦项目被添加上去了我们就可以从中间获取我们想要的数据,下面代码中间红色部分就是用于更新AdventureWorksLTEntities数据模型的。
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
}
}
搞定之后我们就需要在我们的项目中添加AJAX4了,我们可以直接下载AJAX4并放到我们的项目路径钟,因为AJAX是文件,所以我们可以下载的AJAX4是可以看到源代码的。:),我们可以放到如下图所示的地方。

然后我们的插件页面就是一个很简单的页面,注意前面我也写过,Windows Mobile 6.5是不能够支持ASP.NET页面的,如果真的要让我们的插件能够在ASP.NET下面运行就相当于在移动设备上安装一个ASP.NET服务器。。。所以我们的插件只能够包含HTML,CSS和JavaScript。我们可以直接创建一个HTML进行插件的内容编写。
OK,我们可以开始编写HTML了,我们的这个页面并没有任何一点的JS代码因为我们的JS代码全部包含在AJAX4库中了。示例代码如下所示。
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>AdventureWorks – Products</title>
<style type="text/css">
.sys-template {display: none;}
.rowSelected {background-color: yellow;}
</style>
<script src="MicrosoftAjax/MicrosoftAjax.debug.js" type="text/javascript"></script>
<script src="MicrosoftAjax/MicrosoftAjaxTemplates.debug.js" type="text/javascript"></script>
<script src="MicrosoftAjax/MicrosoftAjaxAdoNet.debug.js" type="text/javascript"></script> </head>
<body xmlns:sys="BLOCKED SCRIPTSys"
xmlns:dataview="BLOCKED SCRIPTSys.UI.DataView"
xmlns:datacontext="BLOCKED SCRIPTSys.Data.AdoNetDataContext"
sys:activate="*">
<table
sys:attach="datacontext"
datacontext:sys-key="dataContext"
datacontext:serviceuri ="http://192.168.0.102:18886/AdventureWorksData.svc"
>
<thead>
<tr>
<th>Select Category</th>
</tr>
</thead>
<tbody
id="dvCategories"
class="sys-template"
sys:attach="dataview"
dataview:sys-key="categoriesKey"
dataview:dataprovider="{{ dataContext }}"
dataview:autofetch="true"
dataview:selecteditemclass="rowSelected"
dataview:fetchoperation="ProductCategories"
dataview:fetchparameters="{{ {$expand: ‘Products’} }}"
>
<tr sys:command="select">
<td>{{ Name }}</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody
class="sys-template"
sys:attach="dataview"
dataview:sys-key="moviesKey"
dataview:data="{binding selectedData.Products, source={{categoriesKey}} }">
<tr>
<td>{binding Name}</td>
</tr>
</tbody>
</table>
</body>
</html>
上面是一个ADO.NET Data Service模板,这个模板通过AJAX4和我们的Service进行连接,编写完成后我们就可以编写config文件了,示例代码如下所示。
<widget xmlns="http://www.w3.org/ns/widgets"
id="http://www.builttoroam.com/ProductWidget"
version="1.0">
<name>AdventureWorks Product Widget</name>
<description>
Basic product widget based on ajax 4
</description>
<author href="http://www.jguoer.com"
email="soundbbg@live.cn">
Guo Jing and Nick Randolph @ Built To Roam
</author>
<content src="Products.htm" type="text/html"/>
<access network="true"/>
<icon src="BTRLogo.png" />
<license>
here is the license
</license>
</widget>
我们编写完成后就需要打包我们的程序了,打包直接用zip然后修改后缀为wgt即可,然后我们就可以放在我们的设备中用了。然后可以在设备中打开我们的项目,这里我偷懒,还是叫JQuery,可以看到他是不会更新并覆盖原来的程序的。


我们可以看到我们的程序已经正确运行了。
不过我觉得,这样做真的很复杂,开发复杂不说(其实本来HTML和CSS就能够很简单的),然后还需要远程服务,还需要是.NET 3.5 SP1,这在国内的,从主机上是很不好找的,然后在host这方面,也不是很好办,毕竟国内这方面的东西不是很多,对新事物的接受能力也没有国外强。在这里感谢国外有人MVP的指导,在和他探讨中了解了更多关于Widget方面的开发。原文如此。
[q]在VS中用ADO.NET Data Service模板还得安装sqlserver,
MS的东西真是对机器的各项指标需求很高啊。
得安装一堆一堆的IDE、SDK、tools…[/q]
对啊,兼容性还不怎么样,比如我的电脑就装不了Entity Framework,原因是先装了.NET 3.5 SP1而没装VS 08 SP1。。
在VS中用ADO.NET Data Service模板还得安装sqlserver,
MS的东西真是对机器的各项指标需求很高啊。
得安装一堆一堆的IDE、SDK、tools…
[...] Windows Mobile 6.5 Widget – 通过AJAX4,ADO.NET绑定数据 [...]