SharePoint支持移动设备通过WAP访问站点和列表(启用Mobile访问功能stsadm -o activatefeature -name MobilityRedirect -URL http://yoursiteurl/),在站点URL后加上/M即可。可是Mobile访问页面经常变形,如下图:
而且当字段类型是choice单选下拉列表框,绑定数据超过10行后,WAP无法显示多出的选择项。为了使Mobile Device正常使用List,必须为Mobile Device设计一套界面。主要工作就是通过SPD创建Page,使用Data Form Web Part进行浏览,新建,编辑等操作。如下图所示:
浏览界面 新建List Item,Edit界面也相同
图中的列表只有一个content Type,当出现多个Content Type时,可在New Link后添加DropDownList绑定所有的ContentType。
进行下列操作Insert -> SharePoint Controls -> Custom List Form… -> New item form,发现Save button的代码:<SharePoint:SaveButton runat="server" ControlMode="New" id="savebutton2"/>无法在Mobile Device中PostBack,点击后button无反应,不知道是模拟器的原因,还是其他的问题。 解决方法是用<input type="button" value="Save" name="btnSave" onclick="javascript: {ddwrt:GenFireServerEvent('__commit;__redirect={MobileExperience.aspx}')}" />代替。
还有一个问题没有解决:自定义List启用了附件支持功能,Mobile中如何上传附件?<SharePoint:FormToolBar runat="server" ControlMode="New"/> 中的Attach File也是不起作用。抛砖引玉啦,谁知道请回复,谢谢。
相关知识点整理:
引用自:iPark's blog
DataForm Web Part
DataForm Web Part解析:
在SharePoint Designer中插入DataForm以后,你会发现它的代码部分由四大部分组成:
1)DataSources:数据源,可以是单数据源,多数据源链接,SharePoint也提供了各种数据源控件(XML,web服务,数据库,等等)。进行SharePoint中单数据列表操作的时候,用的是SPDataSource控件。
2)ParameterBindings:Web Part的所有参数就包含在这里面
3)DataFields:可在Web Part上显示的所有数据域
4)XSL:XSLT,把数据源的数据转换成你想要的显示样式
DataForm的工作过程一般是这样的:
1)DataForm Web Part会首先处理参数Parameter,数据源中可能含有参数,以筛选数据,XSLT里面也可能有一些参数需要赋值,Web部件会把ParameteBindings块中的所有参数赋值给数据源和XSLT里面ParameterKey相同的参数;
2)然后,DataForm Web Part把数据源对应的数据取出来返回的XML格式数据;<update>我们在SharePoint Designer里面看见的筛选窗口一般就是用来筛选数据源的,它会修改SPDatasource的Selectcommand属性</update>
3)最后,利用XSLT把数据源转换并返回给客户端。
我们在SharePoint Designer里面看见的筛选窗口的高级XPath筛选则是XSLT层次的筛选。也就是说数据源筛选先进行,然后XSLT在逐条数据进行筛选,XSLT的筛选在数据量大的时候可能会影响性能。所以,没有特别的需求最好筛选数据源,不用XPath。
下面介绍一些DataSources,ParameterBindings和XSL相关的一些信息以及有用的链接:
1)DataSources
SPDataSource这个web控件有多种数据源模式:ListItem(单个列表项), List(某个列表), CrossList(跨列表), ListofLists(列表集合,显示列表的信息), Webs(网站的信息)。关于SPDataSource控件的信息,SharePoint Designer Team有一篇很好的Blog:SPDataSource and Rollups with the Data View
如果在ListItem和List模式下,DataForm Web Part中的SPDataSource必须要包含DataFormParameter,DataFormParameter是一个独立的参数类,DataForm Web Part用这个参数来定位数据源列表,同时DataFormParameter也只识别特定的ParameterKey:ListID,ListItemId,ListName,WebUrl等。如果是ListItem模式下,必须要有(ListID or ListName) and ListItemId参数。如果是List模式下,必须要有ListID 或者ListName参数。
技巧:如果你要迁移部署定制好的页的话,你一定要使用ListName参数来定位列表。原因很简单,列表名称在迁移后不会变,但是ListID是会变化的。找到DataSources节,把里面所有的ListID替换成ListName,然后把DefaultValue换成列表名称
在CrossList,ListofLists和Webs模式下的时候,SPDataSource的SelectCommand的写法和SPSiteDataQuery的查询规则相似。比如用<Lists></Lists>可以选择所有的当前网站的列表
2)ParameterBindings
在DataForm Web Part里面需要用到的所有的参数在这里面进行定义,这里的参数会被同时应用到DataForm的数据源和XSLT里面。DataForm Web Part用来定义统一的参数。SPDataSource的Selectcommand可以包含参数,DataFormParameter的值可以来自参数,XSLT中的参数值也可以来自统一定义的参数。
3)XSL
XSL这个主要就是XSLT和XPath的东西了,要能很好的定制DataForm的话,需要比较熟练XSLT和XPath。
DataForm Web Part中的数据操作:
1)客户端中对DataForm中数据的操作
说到这个一般是指对列表新建和编辑的DataForm中数据的操作,我们知道在编辑和新建DataForm中,只有形如:
<SharePoint:FormField runat="server" id="ff2{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff2',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}"/>
的FormField类型的SharePoint的WebControl才被最终的数据提交操作识别,并提交,而且,如果在页面上同一个字段有多个FormField Control的话,最终提交的数据是页面自上到下最后一个FormField的值。
所以,我们一般就是利用Javascript来操作FormField在客户端生成的HTML标签,这些标签是有一些规律的,SharePoint Designer的Team Blog里面有一篇文章详细介绍了如何利用Javascript来操作这些字段控件:Using Javascript to Manipulate a List Form Field
如果我们可以操作这些字段控件,对这些字段控件生成的HTML标签值进行赋值修改的话,我们可以隐藏原本生成的控件标签,使用自己的编辑控件,然后,在提交前,把用户编辑的值赋给隐藏的DataForm提交时能识别的字段控件标签,就可以实现比较深入的编辑新建页面的定制了。其实,在这种状况下,我们相当于只把DataForm作为提交数据的一个载体了。
2)提交数据到服务器端
DataForm与server的数据交互基本是由http://schemas.microsoft.com/WebParts/v2/DataView/runtime这个名称空间下(一般在DataForm的XSLT中以ddwrt出现)ddwrt:GenFireServerEvent(string EventString)方法来实现。其实原理很简单ddwrt:GenFireServerEvent这个方法解析出来以后是__dopostback()方法,会触发Postback,把EventString作为Postback的参数,然后DataForm会根据EventString处理相应的数据提交操作。比如,如果你在DataForm使用了一个<a href="javascript: {ddwrt:GenFireServerEvent('__commit; ')}">Submit</a>来向服务器端做一个提交操作,在客户端显示的时候这个串就被解析成了<a href="javascript: __doPostBack('ctl00$m$g_18a01f88_4df1_41ef_abef_151d51648f2c','__commit');">Submit</a>,前部分ctl00$m$g_18a01f88_4df1_41ef_abef_151d51648f2c是DataForm Web Part的ID,后面的就是事件的参数,__doPostBack的方法在每个页面你都可以通过查看源文件看到这个方法,它干的事情就是提交页面。GenFireServerEvent可以通过__dopostback向服务器提交任何参数,DataForm可以识别的一些特定的参数包括:
1)__commit; 所有的数据提交都要包括这个参数。DataForm会根据当前的模式进行提交操作,如果当前是Listform模式,就会把数据提交到列表中去。如果是Table模式,就确认对DataForm的其他操作。说白了,所有的新建,修改,删除都需要加上这个参数才能生效。
2)__refresh; 刷新页面
3)__cancel; 取消这个参数之前的所有操作,即在这个参数之前的所有参数都不起作用
4)__redirectsource; 把页面转向到URL中的Source参数对应的地址,如果URL中没有Source参数则返回列表的默认视图
5)__redirect={URL}; 把页面转向到一个制定的URL,这个URL中可以是通过XSLT动态赋值,一个列表编辑DataForm页面提交的例子:<a href="javascript: {ddwrt:GenFireServerEvent(concat('__commit;__refresh;__redirect={DispForm.aspx?ID=',@ID))}">Submit</a> 意思就是编辑提交完成以后跳转到项目显示页面。
6)__delete={ID=3}; 删除某个列表项,参数是ID,一般我们可以在显示所有列表的页面给每个项目加一个删除超链接,这个ID的参数就需要在XSLT里面动态附加,形如<a href="javascript: {ddwrt:GenFireServerEvent(concat('__delete={ID=',@ID,'};__delete={ID=4};__delete={ID=5};__delete={ID=6};__commit;__refresh;'))}">delete</a>,其中concat是用来拼接文本的xslt函数,把@ID与其他的参数拼接。__delete这个参数在一个GenFireServerEvent中可以存在多个比如:<a href="javascript: {ddwrt:GenFireServerEvent('__delete={ID=3};__delete={ID=4};__delete={ID=5};__delete={ID=6};__commit;__refresh;')}">delete</a>这个删除链接就是同时删除ID为3,4,5,6的四个列表项。可以看到用了__commit;参数来真正让DataForm去执行删除的动作。GenFireServerEvent还可以用来Postback任意参数,DataForm中包含一种类型的参数形如:<ParameterBinding Name="dvt_groupdir" Location="Postback;Connection"/> 这种参数就是从Postback回来的值中取得,做分页的时候需要使用到利用GenFireServerEvent来传值。
3)一些补充
a)既然GenFireServerEvent方法其实就是解析成了__dopostback方法,把DataForm的ID和参数给了__dopostback方法。所以如果我们需要,我们可以修改DataForm的ID,不要使用默认生成的GUID,如果你用了自定制的ID以后,使用备份恢复部署后DataForm的ID就不会变了,这样的话我们直接在javascript里面写__dopostback方法了,因为DataForm的ID我们可以确定的知道了。这个东西有什么用呢?目前我碰到的唯一一个需要用到这个变态方法的地方是,当需要实现可以让用户选择列表中的某几个列表项进行删除的时候,就必须用到这个方法了。
b)使用了自定义操作以后,我们通过备份网站,恢复网站进行定制的部署后,我们会发现自定义操作都不能用了,点击带有自定义操作的按钮就报错!这个的解决办法链接:SharePoint 的无代码工作流在备份还原后不能使用的问题。
c)我们是用Custom List Form以后,“Attach File”这个功能就失效了!如何即可以定制编辑页面,有可以正常使用附件上传功能呢?微软已经给出了方法:您尝试附加到自定义窗体中 Windows SharePoint Services 3.0 中的网站上的文件时收到错误消息: 的此窗体进行自定义不使用附件"
Windows Mobile:
测试环境配置:
2)安装Windows Mobile 6.1 Professional Images (USA).ms
3)启动ActiveSync和Device Emulator Manager即可正常测试。
备注:6.1SDK自带了Cellular Emulator,用它可通过GPRS上网,这样就不用安装ActiveSync了。注意上网配置时选择正确的COM和My Work Network