2017-07-15 122 views
1

我想用React Office UI Fabric构建一个SPFX WebPart。我有一个人名字段为AssignedTo的SharePoint列表。 ID值与12,20等一样。当我用PeoplePicker选择一个人时,我得到AccountName,如i:0#.f|membership|[email protected]和一个GUID,如ff53b41e-d11a-435c-9cd1-d708e71ee7c7SPFx如何在列表中设置人员字段“将”AccountName转换为Lookup ID?

如何将PeoplePicker的信息“转换”为ID,列表中的People字段正在使用?

的PeoplePicker检索人民如下:

private searchPeople(terms: string, results: IPersonaProps[]): IPersonaProps[] | Promise<IPersonaProps[]> { 
    return new Promise<IPersonaProps[]>((resolve, reject) => 
    this.props.spHttpClient.get(`${this.props.siteUrl}/_api/search/query?querytext='*${terms}*'&rowlimit=20&sourceid='b09a7990-05ea-4af9-81ef-edfab16c4e31'`, 
    SPHttpClient.configurations.v1, 
    { 
     headers: { 
     'Accept': 'application/json;odata=nometadata', 
     'odata-version': '' 
     } 
    }) 
    .then((response: SPHttpClientResponse): Promise<{ PrimaryQueryResult: IPeopleDataResult }> => { 
     return response.json(); 
    }) 
    .then((response: { PrimaryQueryResult: IPeopleDataResult }): void => { 
     let relevantResults: any = response.PrimaryQueryResult.RelevantResults; 
     let resultCount: number = relevantResults.TotalRows; 
     let people = []; 
     if (resultCount > 0) { 
     relevantResults.Table.Rows.forEach((row) => { 
      let persona: IPersonaProps = {}; 
      row.Cells.forEach((cell) => { 

      if (cell.Key === 'PictureURL') 
      { 
       persona.imageUrl = cell.Value; 
      } 
      else if (cell.Key === 'PreferredName') 
      {     
       persona.primaryText = cell.Value; 
       persona.imageInitials = cell.Value.charAt(0) + (cell.Value.lastIndexOf(" ") > 0 ? cell.Value.charAt(cell.Value.lastIndexOf(" ") + 1) : ""); 
      } 
      else if (cell.Key === 'AccountName') 
      {     
       persona.itemID = cell.Value; // e.g.: "i:0#.f|membership|[email protected]" 
      } 
      else if (cell.Key === 'UserProfile_GUID') 
      {     
       persona.itemID = cell.Value; // e.g.: "ff53b41e-d11a-435c-9cd1-d708e71ee7c7" 
      } 
      }); 
      people.push(persona); 
     }); 
     } 
     resolve(people); 
    }, (error: any): void => { 
     reject(this._peopleList = []); 
    })); 
} 

我得到的列表项目如下:

private _getItems(requester: SPHttpClient): Promise<IInteractionLogItem[]> { 
    const queryString: string = `?$select=Id,Title,Client/Id,Client/Title,Client/EMail,Client/MobilePhone,` + 
    `$expand=Client`; 
const queryUrl: string = this._listItemsUrl + queryString; 

return requester.get(queryUrl, SPHttpClient.configurations.v1) 
    .then((response: SPHttpClientResponse) => { 
    return response.json(); 
    }) 
    .then((json: { value: IInteractionLogItem[] }) => { 
    return json.value.map((interactionLog: IInteractionLogItem) => { 
     const returnItem: IInteractionLogItem = 
     { 
     Id: interactionLog.Id, 
     Title: interactionLog.Title, 
     Client: interactionLog.Client, 
     }; 

     returnItem.CreatedBy.Picture = this._getPictureUrl(returnItem.CreatedBy.EMail); 

     if(returnItem.Client) 
     { 
     returnItem.Client.Picture = this._getPictureUrl(returnItem.Client.EMail); 
     } 

     return returnItem; 
    }); 
    }); 
} 

任何帮助深表感谢:-)

回答

1

的调用api/web/ensureuser使用SPHttpClient是必要的。它确保将请求的用户加载到SharePoint网站userinfo中。使用给定的AccountName,如i:0#.f|membership|[email protected]从搜索中作为参数。返回的SPUser包含查找列的Id字段。我采取了以下方法:

public EnsureUser(userName: string): Promise<ISPUser> { 
    console.log("SharePointDataProvider.EnsureUser(\"" + userName + "\")"); 
    var data = {logonName: userName}; 

    return this._webPartContext.spHttpClient.post(
    this._ensureUserUrl, 
    SPHttpClient.configurations.v1, 
    { body: JSON.stringify(data) }).then(
     (value: SPHttpClientResponse) => { 
     console.log("SharePointDataProvider.EnsureUser FullFill: statusText:\"" + value.statusText + "\""); 
     return value.json(); 
     }, 
     (error: any) => console.log("SharePointDataProvider.EnsureUser Rejected: " + error) 
    ).then((json: ISPUser) => { 
     console.log("SharePointDataProvider.EnsureUser FullFill: Id:" + json.Id +" LoginName:\"" + json.LoginName + "\""); 
     return json; 
    }); 
} 

我的迷你ISPUser接口:

interface ISPUser 
{ 
    Email: string; 
    Id: number; 
    LoginName: string; 
    Title: string; 
} 
相关问题