Mobile Device 访问自定义page,非WAP访问

SharePoint支持移动设备通过WAP访问站点和列表(启用Mobile访问功能stsadm -o activatefeature -name MobilityRedirect -URL http://yoursiteurl/),在站点URL后加上/M即可。可是Mobile访问页面经常变形,如下图:

Mobile Device 访问自定义page,非WAP访问   Mobile Device 访问自定义page,非WAP访问

而且当字段类型是choice单选下拉列表框,绑定数据超过10行后,WAP无法显示多出的选择项。为了使Mobile Device正常使用List,必须为Mobile Device设计一套界面。主要工作就是通过SPD创建Page,使用Data Form Web Part进行浏览,新建,编辑等操作。如下图所示:

Mobile Device 访问自定义page,非WAP访问              Mobile Device 访问自定义page,非WAP访问             Mobile Device 访问自定义page,非WAP访问

              浏览界面                               新建List ItemEdit界面也相同

图中的列表只有一个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 DevicePostBack,点击后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以后,你会发现它的代码部分由四大部分组成:

1DataSources:数据源,可以是单数据源,多数据源链接,SharePoint也提供了各种数据源控件(XMLweb服务,数据库,等等)。进行SharePoint中单数据列表操作的时候,用的是SPDataSource控件。

2ParameterBindingsWeb Part的所有参数就包含在这里面

3DataFields:可在Web Part上显示的所有数据域

4XSLXSLT,把数据源的数据转换成你想要的显示样式

 

DataForm的工作过程一般是这样的:

1DataForm Web Part会首先处理参数Parameter,数据源中可能含有参数,以筛选数据,XSLT里面也可能有一些参数需要赋值,Web部件会把ParameteBindings块中的所有参数赋值给数据源和XSLT里面ParameterKey相同的参数;

2)然后,DataForm Web Part把数据源对应的数据取出来返回的XML格式数据;<update>我们在SharePoint Designer里面看见的筛选窗口一般就是用来筛选数据源的,它会修改SPDatasourceSelectcommand属性</update>

3)最后,利用XSLT把数据源转换并返回给客户端。

 

我们在SharePoint Designer里面看见的筛选窗口的高级XPath筛选则是XSLT层次的筛选。也就是说数据源筛选先进行,然后XSLT在逐条数据进行筛选,XSLT的筛选在数据量大的时候可能会影响性能。所以,没有特别的需求最好筛选数据源,不用XPath

 

下面介绍一些DataSourcesParameterBindingsXSL相关的一些信息以及有用的链接:

1DataSources

SPDataSource这个web控件有多种数据源模式:ListItem(单个列表项), List(某个列表), CrossList(跨列表), ListofLists(列表集合,显示列表的信息), Webs(网站的信息)。关于SPDataSource控件的信息,SharePoint Designer Team有一篇很好的BlogSPDataSource and Rollups with the Data View

 

如果在ListItemList模式下,DataForm Web Part中的SPDataSource必须要包含DataFormParameterDataFormParameter是一个独立的参数类,DataForm Web Part用这个参数来定位数据源列表,同时DataFormParameter也只识别特定的ParameterKeyListIDListItemIdListNameWebUrl等。如果是ListItem模式下,必须要有(ListID or ListName) and ListItemId参数。如果是List模式下,必须要有ListID 或者ListName参数。

技巧:如果你要迁移部署定制好的页的话,你一定要使用ListName参数来定位列表。原因很简单,列表名称在迁移后不会变,但是ListID是会变化的。找到DataSources节,把里面所有的ListID替换成ListName,然后把DefaultValue换成列表名称

CrossListListofListsWebs模式下的时候,SPDataSourceSelectCommand的写法和SPSiteDataQuery的查询规则相似。比如用<Lists></Lists>可以选择所有的当前网站的列表

 

2ParameterBindings

DataForm Web Part里面需要用到的所有的参数在这里面进行定义,这里的参数会被同时应用到DataForm的数据源和XSLT里面。DataForm Web Part用来定义统一的参数。SPDataSourceSelectcommand可以包含参数,DataFormParameter的值可以来自参数,XSLT中的参数值也可以来自统一定义的参数。

 

3XSL

XSL这个主要就是XSLTXPath的东西了,要能很好的定制DataForm的话,需要比较熟练XSLTXPath

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类型的SharePointWebControl才被最终的数据提交操作识别,并提交,而且,如果在页面上同一个字段有多个FormField Control的话,最终提交的数据是页面自上到下最后一个FormField的值。

所以,我们一般就是利用Javascript来操作FormField在客户端生成的HTML标签,这些标签是有一些规律的,SharePoint DesignerTeam Blog里面有一篇文章详细介绍了如何利用Javascript来操作这些字段控件:Using Javascript to Manipulate a List Form Field

如果我们可以操作这些字段控件,对这些字段控件生成的HTML标签值进行赋值修改的话,我们可以隐藏原本生成的控件标签,使用自己的编辑控件,然后,在提交前,把用户编辑的值赋给隐藏的DataForm提交时能识别的字段控件标签,就可以实现比较深入的编辑新建页面的定制了。其实,在这种状况下,我们相当于只把DataForm作为提交数据的一个载体了。

 

2)提交数据到服务器端

DataFormserver的数据交互基本是由http://schemas.microsoft.com/WebParts/v2/DataView/runtime这个名称空间下(一般在DataFormXSLT中以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_151d51648f2cDataForm Web PartID,后面的就是事件的参数,__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>这个删除链接就是同时删除ID3456的四个列表项。可以看到用了__commit;参数来真正让DataForm去执行删除的动作。GenFireServerEvent还可以用来Postback任意参数,DataForm中包含一种类型的参数形如:<ParameterBinding Name="dvt_groupdir" Location="Postback;Connection"/> 这种参数就是从Postback回来的值中取得,做分页的时候需要使用到利用GenFireServerEvent来传值。

 

3)一些补充

a)既然GenFireServerEvent方法其实就是解析成了__dopostback方法,把DataFormID和参数给了__dopostback方法。所以如果我们需要,我们可以修改DataFormID,不要使用默认生成的GUID,如果你用了自定制的ID以后,使用备份恢复部署后DataFormID就不会变了,这样的话我们直接在javascript里面写__dopostback方法了,因为DataFormID我们可以确定的知道了。这个东西有什么用呢?目前我碰到的唯一一个需要用到这个变态方法的地方是,当需要实现可以让用户选择列表中的某几个列表项进行删除的时候,就必须用到这个方法了。

b)使用了自定义操作以后,我们通过备份网站,恢复网站进行定制的部署后,我们会发现自定义操作都不能用了,点击带有自定义操作的按钮就报错!这个的解决办法链接:SharePoint 的无代码工作流在备份还原后不能使用的问题

c)我们是用Custom List Form以后,“Attach File”这个功能就失效了!如何即可以定制编辑页面,有可以正常使用附件上传功能呢?微软已经给出了方法:您尝试附加到自定义窗体中 Windows SharePoint Services 3.0 中的网站上的文件时收到错误消息: 的此窗体进行自定义不使用附件"

 

Windows Mobile:

测试环境配置:

1)安装Microsoft ActiveSync 4.5

2)安装Windows Mobile 6.1 Professional Images (USA).ms

3)启动ActiveSyncDevice Emulator Manager即可正常测试。

备注:6.1SDK自带了Cellular Emulator,用它可通过GPRS上网,这样就不用安装ActiveSync了。注意上网配置时选择正确的COMMy Work Network

你可能感兴趣的:(mobile)