【问题标题】:Sharepoint 2013 - EditForm, people picker new value not savingSharepoint 2013 - EditForm,人员选择器新值不保存
【发布时间】:2015-02-15 15:49:22
【问题描述】:

我已使用以下代码在人员选择器中添加价值。该代码在 NewForm.aspx 中运行良好。但是当我在 EditForm.aspx 中编辑人员选择器时,它不会采用新值。它只保存旧值。

function SetNewPeoplePicker(controlName, Username) {
var ppDiv = jQuery("[id$='ClientPeoplePicker'][title='" + controlName + "']");      
var ppEditor = ppDiv.find("[title='" + controlName + "']"); 
var spPP = SPClientPeoplePicker.SPClientPeoplePickerDict[ppDiv[0].id];          
ppEditor.val(Username);                 // Set the value
spPP.AddUnresolvedUserFromEditor(true);                 // Resolve the User if (!spPP.HasInputError) 
{
        var userKeys = spPP.GetAllUserInfo();
        var myUser = userKeys[0];
        Manager = myUser.AutoFillDisplayText;
}
spPP.SetEnabledState(false);
jQuery('a.sp-peoplepicker-delImage').hide();

}

我读到我们必须将 webpart 属性更改为“服务器渲染”。但是整个 UI 发生了变化,我用 JS 为其他字段编写的代码失败了。

谁能提供解决方案。

【问题讨论】:

    标签: jquery sharepoint sharepoint-2013


    【解决方案1】:

    由于您使用的是 SharePoint 2013,我建议您考虑以下方法。在 SharePoint 2013 中引入了所谓的 Client Rendering Mode (CSR),它旨在使用 HTML 和 JavaScript 呈现列表视图和表单,并且是一种默认呈现模式

    如何使用 CSR 在新建/编辑表单中初始化用户字段

    以下示例演示了如何在 NewEdit 表单中初始化用户字段(Tasks 列表中的AssignedTo 字段):

    模板代码:

    (function () {
        var ctx = {};
        ctx.Templates = {};
        ctx.Templates.Fields = {
            'AssignedTo': {
                'NewForm': renderPeoplePickerWithDefaultValue,
                'EditForm': renderPeoplePickerWithDefaultValue
            }
        };
        SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);
    })();
    
    function renderPeoplePickerWithDefaultValue(ctx) {
         //1.set user field value
         var loginName = String.format('i:0#.f|membership|{0}',_spPageContextInfo.userLoginName);  //set to current user login name
         var displayName = $('div#SuiteNavUserName').text();   //set to current user display name 
         var userEntry = createUserEntity(loginName,displayName);
         ctx.CurrentFieldValue = [];   //Note: it is assumed the user field is a multi-valued field (!)
         ctx.CurrentFieldValue.push(userEntry);
         //2.render default People Picker  
         return SPClientPeoplePickerCSRTemplate(ctx); 
    }
    
    function createUserEntity(loginName,displayName)
    {
       return {
          Description: loginName,
          DisplayText: displayName,
          EntityGroupName: "",
          EntityType: "",
          HierarchyIdentifier: null,
          IsResolved: true,
          Key: loginName,
          MultipleMatches: [],
          ProviderDisplayName: "",
          ProviderName: ""
       };
    }
    

    P.S.:在指定的示例中,AssignedTo 字段设置为当前 用户,为了指定另一个用户,修改loginNamedisplayName参数。

    P.P.S.该示例已在 SharePoint Online 中进行了测试

    如何应用更改

    如何应用更改至少有两个选项:

    1. 使用JSLink property
    2. 通过Script Editor/Content Editor将JavaScript模板放置在页面上 Web 部件

    以下是使用第二个选项应用更改的方法:

    1. 将页面 (NewForm.aspx) 切换到编辑模式
    2. 在列表视图 Web 部件的正下方添加 Script Editor webpart。
    3. 通过使用script标签代码将指定代码包装到脚本编辑器中,例如:<script type="text/javascript">{Template JS code goes here}</script>
    4. 保存页面

    结果

    参考

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多