【SharePoint】SharePoint2013中使用客户端对象模型给用户控件赋初值

本文要实现的功能:新建一条列表记录,打开新建记录画面时,自动给【申请人】赋值为当前登录用户。

在SharePoint2010中,可以使用SPServicesSPFindPeoplePicker方法来设定用户选择控件的值。
其中SPGetCurrentUser用来取得当前登录的用户名。

$().SPServices.SPFindPeoplePicker({
    peoplePickerDisplayName: "申请人",
    valueToSet: $().SPServices.SPGetCurrentUser(),
    checkNames: true
});

但是SPServicesSPFindPeoplePicker方法在SharePoint2013中没有效果。

后来发现了这篇文章SP2013: Setting people picker value in NewForm.aspx
原文里隐藏删除图标的代码有bug,下面是修改后的代码:

function SetAndDisablePeoplePicker(fieldName, userAccountName) {
    var controlName = fieldName;
    var peoplePickerDiv = $("[id$=‘ClientPeoplePicker‘][title=‘" + controlName + "‘]");
    var peoplePickerEditor = peoplePickerDiv.find("[title=‘" + controlName + "‘]");
    var spPeoplePicker = SPClientPeoplePicker.SPClientPeoplePickerDict[peoplePickerDiv[0].id];

    peoplePickerEditor.val(userAccountName);
    spPeoplePicker.AddUnresolvedUserFromEditor(true);

    //disable the field
    spPeoplePicker.SetEnabledState(false);
    //hide the delete/remove use image from the people picker
    peoplePickerDiv.find(‘.sp-peoplepicker-delImage‘).css(‘display‘,‘none‘);
}

SetAndDisablePeoplePicker("申请人", $().SPServices.SPGetCurrentUser({fieldName:"UserName"}));

本来想用SPGetCurrentUser方法默认的Name属性值,但在SharePoint2013中会变成 【i:0#.w|domain\username】的样子,直接使用的话无法检索到用户。

这里直接使用了UserName属性值,另外还可以使用Name属性值中竖线后面部分的值。

单独执行上面的代码可以成功实现赋值的效果,但是在画面加载后执行时出现如下错误。

Uncaught ReferenceError: SPClientPeoplePicker is not defined
或者
Uncaught TypeError: Cannot read property ‘get_current’ of undefined

debug发现是代码加载顺序导致的。 虽然JS代码使用了_spBodyOnLoadFunctionNames.push(“funcName”)方法在页面加载完成后执行上面的JS代码,但是由于使用了RegisterSod延迟加载,导致即使页面加载完了,相关的JS文件还没有执行。

<script type="text/javascript">RegisterSod("clientpeoplepicker.js", "\u002f_layouts\u002f15\u002fclientpeoplepicker.debug.js?rev=1g1eASPDnQkf5uTwy7wWMA\u00253D\u00253D");</script>
<script type="text/javascript">RegisterSod("sp.js", "\u002f_layouts\u002f15\u002fsp.debug.js?rev=IR\u00252FvhMqBTNIUqECkE3HAZw\u00253D\u00253D");RegisterSodDep("sp.js", "sp.runtime.js");RegisterSodDep("sp.js", "sp.ui.dialog.js");RegisterSodDep("sp.js", "sp.res.resx");</script>

参照SharePoint JS延迟加载类(SP.SOD)介绍。使用executeOrDelayUntilScriptLoaded方法,待sp.js文件加载后,再执行初期处理。

ExecuteOrDelayUntilScriptLoaded(init, "sp.js");

function init() {
    SetAndDisablePeoplePicker("申请人", $().SPServices.SPGetCurrentUser({fieldName:"UserName"}));
}
时间: 2024-08-12 10:02:03

【SharePoint】SharePoint2013中使用客户端对象模型给用户控件赋初值的相关文章

ASP.NET MVC 中使用用户控件——转

讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件, 我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <script language="javascript" type="text/javascript" src="<%

.net用户控件

用户控件用户控件是个什么东西?自定义的反复重用的控件集合 好处?1.代码重用2.结构良好3.分工开发4.局部缓存 难点:一.交换信息: 注意信息的交换只在相邻层之间进行交换,如果是嵌套交换信息除Session外都需要一层一层的写代码交互 (一)从页面向用户控件交换信息.代码写在页面中. 1.用户控件名.FindControl("用户控件中的控件的ID") TextBox textBox1 = WUC1.FindControl("TextBox1") as TextB

ios用户控件

22:48:452015-03-16说道用控件,很地东方都在用.用好了,可以加快开发进度,提高可维护性,程序的稳定,健壮性,用不好,也可以提高经验值啊,下次就好了,算是学习成本吧. 不同语言,不同项目个不相同. IOS中还是xib方式.用户控件.h 用户控件.m 用户控件.xib .相互配合.xib文件还UI部分,这个算是有个设计视图,可以直接看效果,减少代码量. .h 定义对外部分,.m具体实现.

普通用户控件使用

我们来新建一个用户控件UserControl1.xaml ? <UserControl x:Class="WpfApplicationDemo.Control.UserControl1"              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"              xmlns:x="http://schemas.microsoft.com/win

Asp.net 恢复页面内用户控件内的控件ClientID

众所周知在Asp.net中如果一个页面添加了一个用户控件(或母版页),那么用户控件内的控件的   ClientID号会被自动添加页面中用户控件的ClientID 即页面中的控件内的控件ClientID=用户控件id号+"_"+用户控件内控件的id号 说的太绕了,还是看下例子吧 在一个asp.net页面index.aspx中添加了一个head.ascx用户控件id号为"head1" head.ascx控件中有一个input#hid_name控件 那么index.asp

webform用户控件

一,用户控件与页面的区别 1.扩展名:用户控件——.ascx  页面——.aspx 2.内容:页面有完整的HTML标记,用户控件没有 3.声明指示符:页面<%@ Page ...%>  用户控件<%@ Control ...%> 4.类的派生:页面派生自Page,用户控件派生自UserControl 5.页面可以独立运行,用户控件不能,它只能放在页面中才能运行 二,用户控件的好处 1.最大限度的实现代码重用,省去重复写代码的麻烦 2.团队合作时可以实现分工开发,节省时间 3.结构良

ASP.NET MVC加载用户控件后并获取其内控件值或赋值

有网友看了这篇<ASP.NET MVC加载ASCX之后,并为之赋值>http://www.cnblogs.com/insus/p/3643254.html 之后,问及Insus.NET,不想在控件制器内进行赋值,而是想在视图中使用jQuery来获取用户控件内的控件值或是为它们赋值.那需要怎样来做呢? 下面Insus.NET花上少少时间,做个简单的例子,演示与分享实现的方法. 实现之前,先修改一下AscxUtility.cs这个类中的 public static HtmlString Rende

使用CefSharp 在C#用户控件中嵌入Chrome浏览器使用方法

CEF(Chromium Embedded Framework, 嵌入式Chromium框架)是C/C++开发的库 目前 Google Chrome(Google浏览器),Chromium浏览器,Opera等都是基于CEF为核心,Webkit引擎的浏览器. Xilium.CefGlue是对CEF项目的.net的包装,它是用P/Invoke的方式来调用CEF类库.CEFSharp是用C++/CLI的方式来调用CEF类库的. 原先使用的是Xilium.CefGlue,如果只是单纯在窗口上实现的话是没

VB.Net中用户控件的使用

机房重构时,在界面的制作上有这样一个需要改进的地方.那就是在判断窗体上所有文本框时候为空的时候,弹出提示信息的问题.先看一下原先的代码: <pre name="code" class="vb"> Public Function IsEmptyText(ByVal objs As Form) As Boolean '遍历窗体中所有的控件 For i As Integer = objs.Controls.Count - 1 To 0 Step -1 '判断是