在Sandbox(沙盒)中使用PeoplePicker
来源:互联网 发布:淘宝代码生成器 编辑:程序博客网 时间:2024/06/15 16:55
原文地址:点击打开链接
在SharePoint的sandbox模式下开发,是不允许使用Microsoft.SharePoint.WebControls这个命名空间的。也就是说你不能在后台代码中初始化这个命名空间下的对象,不能在后台使用这里面的类,但是可以在页面上添加这个控件。
Sandbox 属于server端开发
如前所述,sandbox有这样的限制,这意味着你不能在sandbox模式下使用这些控件类。但是你仍然把Microsoft.SharePoint.WebControls里面的控件添加到aspx页面上。例如,如果你自定义了一个master page,肯定会包含CssRegistration或者CssLink这样的控件,它们都属于Microsoft.SharePoint.WebControls。你不能使用代码来操作这些类,比如你不能使用CssRegistration.Register()这样的代码,但是可以把这个控件添加到页面上,下面的方法在sandbox模式下是可以使用的:
<SharePoint:CssRegistration name="<% $SPUrl:~sitecollection/Style Library/~language/Themable/Core Styles/controls.css %>" runat="server"/>
小测验
在sandbox模式下,PeopleEditor 控件可以用在以下哪个对象上面? A) aspx页面, B)webpart, C)都可以
答案是A,一个aspx页面。
将People Picker添加到页面中
如果需要将People Picker添加到页面中,首先需要使用如下方法在页面上注册命名空间(以SharePoint 2010为例):
<%@ register tagprefix="SharePoint"namespace="Microsoft.SharePoint.WebControls"assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
然后添加一个people picker控件,指定一些属性:
<SharePoint:PeopleEditor AllowEmpty="false" ValidatorEnabled="false" id="assignedTo" runat="server" SelectionSet="User,SPGroup" MultiSelect="false"/>添加之后,在我的自定义task编辑表单上是这样的:
验证输入值
因为使用后台代码来验证输入的方法在sandbox中是不行的,所以要使用一些js代码来确保输入值是正确的,是验证过的,来保证可以在页面上读取正确的信息。
people picker有四种状态:
1. 输入无效
2. 输入有效
3. 没有输入
4. 未验证状态
对于第一种和第二种状态,可以使用js来查找控件中的isresolved属性,如果是第一种状态,isresolved的值是false,否则是true。
可以使用下面的方法获取状态:
if ($('#ctl00_PlaceHolderMain_assignedTo').find('*[isresolved="False"]').length > 0) { //ctl00_PlaceHolderMain_assignedTo是控件id return false; //输入无效}if ($('#ctl00_PlaceHolderMain_assignedTo').find('*[isresolved="True"]').length > 0) { return true; //输入有效}
对于第三种状态,可以检查控件的“upLevelDiv”这个div,(这个div是控件渲染出来的,用来保存用户输入的值),如果这个div是空的,则说明没有输入:
var entry = $(‘#ctl00_PlaceHolderMain_assignedTo_upLevelDiv’).html(); //upLevelDiv的id是控件的id加上“_upLevelDiv”if (entry === "" || entry === " ") {return true; //没有输入}对于最后一种状态,就需要使用控件自己的验证方法了,就是使用WebForm_DoCallBack方法来验证输入值:
var checkingName = false;function checkName() { if (!checkingName) { checkingName = true; var arg = getUplevel('ctl00_PlaceHolderMain_assignedTo'); var ctx = 'ctl00_PlaceHolderMain_assignedTo'; EntityEditorSetWaitCursor(ctx); WebForm_DoCallback('ctl00$PlaceHolderMain$assignedTo', arg, EntityEditorHandleCheckNameResult, ctx, EntityEditorHandleCheckNameError, true); }}
所以完整的验证逻辑是:
function nameIsValid() { if ($('#ctl00_PlaceHolderMain_assignedTo').find('*[isresolved="False"]').length > 0) { checkingName = false; return false; //输入无效 } if ($('#ctl00_PlaceHolderMain_assignedTo').find('*[isresolved="True"]').length > 0) { checkingName = false; return true; //输入有效 } var entry = $('#ctl00_PlaceHolderMain_assignedTo_upLevelDiv').html(); if (entry === "" || entry === " ") { return true; //没有输入 } checkName(); //有输入但是没有验证 setTimeout(ValidateAndSave, 500); //等待半秒钟在进行其他的保存值的操作。 return false;}
读取结果
如果使用以上的方法,提交了表单,就可以在后台代码中,通过form的字段来读取输入值了:
SPUser user = web.EnsureUser(task.assignedTo);SPFieldUserValue at = newSPFieldUserValue(web, user.ID, user.LoginName);
但是我更喜欢用js方法将输入值保存到一个hidden field中再使用它,这样做的好处是将people picker和后台代码完全分离了,可以使用如下方法在前端获取输入值:
function getName() { var data = $('#ctl00_PlaceHolderMain_assignedTo_upLevelDiv').html(); if (data !== "" && data !== " ") { var ret = $('#ctl00_PlaceHolderMain_assignedTo').find('div#divEntityData').attr('key'); if (ret !== undefined) { return ret; } else { return ""; } } return "";}
×注,这个方法也是一个在客户端验证和读取people picker信息的方法,可以用在任何需要people picker的地方。
- 在Sandbox(沙盒)中使用PeoplePicker
- iOS--在Sandbox(沙盒)中创建文件夹和文件
- iOS--在Sandbox(沙盒)中创建文件夹和文件
- iOS中 沙盒(sandbox)与归档(NSKeyedArchiver)
- 沙盒sandbox
- sandbox(沙盒)
- Sandbox 沙盒
- 沙盒SandBox
- 在Sandbox中调用系统工具的问题
- MySQL Sandbox安装使用
- SharePoint 2013 使用Javascript 为人员控件赋值。(Set peoplepicker value use JS)
- SharePoint PeoplePicker控件
- ios (sandbox)沙盒
- iOS沙盒(sandbox)
- iOS 沙盒(SandBox)
- iOS沙盒(sandbox)
- 沙盒Sandbox介绍
- iOS沙盒(sandbox)机制
- 经典SQL语句大全
- equals() ,hashcode() 使用
- 对与几种javax.el.PropertyNotFoundException: Property 'XXX' not found on type java.lang.String问题原因
- 本年哪一天?
- UVa 10714 - Ants
- 在Sandbox(沙盒)中使用PeoplePicker
- spring组件扫描<context:component-scan/>使用详解
- Centos 6.4 搭建svn
- Gleasy CTO薛珂:成立3年,企业用户2万+,移动办公蕴藏较大发展机遇
- 如何在英特尔® 架构手机上为 Miracast* 实现英特尔® 无线显示差异化
- OpenLayers基础知识(二)
- Cannot generate SSPI context
- 三种工厂模式的C++实现
- synchronized