在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的地方。


0 0
原创粉丝点击