[英]How can I determine if a Sharepoint ListItem exists based on a couple of known values?
我有這個Sharepoint(2010)Javascript(改編自這里 )在ListItem中插入或更新各種“字段”:
var listId;
. . .
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
listId = this.oListItem.ID;
oListItem.set_item('ptli_formFilledOut', new Date());
oListItem.set_item('ptli_TravelersName', $('travelername').val());
. . .
oListItem.update();
clientContext.load(oListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
在上面的代碼中,第一個“upsert”存儲“listId”; 后續寫入列表(它是逐段編寫的,以防用戶停止或某些東西停止它們,然后再返回它們)使用getItemById()方法獲取之前開始的ListItem:
function upsertPostTravelListItemTravelerInfo2() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.oListItem = oList.getItemById(listId);
oListItem.set_item('ptli_tripNumber', $('tripnumber').val());
. . .
我的挑戰是在用戶想要在上面顯示的兩種方法中的第一種(upsertPostTravelListItemTravelerInfo1())中更新數據的第一位(它們插入那些,然后稍后返回並決定更改某些內容)的情況。
我也需要在這里使用getItemById()。 當這是第一個條目時,它還不存在,我使用:
listId = this.oListItem.ID;
...但是當這部分正在更新時,需要listId以便我可以:
this.oListItem = oList.getItemById(listId);
為此 - 為listId分配正確的值 - 我將需要詢問列表以查看某些值的“記錄”是否已經存在,因此已經存在listId; 偽代碼:
listId = //a "record" with a username value of "<userName>" and a payeeName of "<payeeName>" with a "Completed" value of "false")
if (listId == null) {
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
listId = this.oListItem.ID;
} else {
this.oListItem = oList.getItemById(listId);
}
我的問題是:我需要用什么代替偽代碼? Sharepoint 2010 ListItem如何查詢,類似於查詢,以查找特定ListItem成員值的匹配“記錄”?
根據crclayton的第一個想法,我在想這個:
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.website = context.get_web();
this.currentUser = website.get_currentUser();
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
var travelersEmail = $('traveleremail').val());
/* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem. */
listId = getListItemID(currentUser, travelersEmail);
if (listId === '') {
listId = this.oListItem.ID;
}
oListItem.set_item('ptli_formFilledOut', new Date());
oListItem.set_item('ptli_TravelersName', $('travelername').val());
oListItem.set_item('ptli_TravelersEmail', travelersEmail);
. . .
}
function getListItemID(username, payeename) {
var arrayListEnum = oList.getEnumerator();
while (arrayListEnum.moveNext()) {
var listItem = arrayListEnum.get_current();
if(listItem.get_item("ptli_formPreparedBy") === username &&
listItem.get_item("ptli_TravelersEmail") === payeename &&
listItem.get_item("ptli_formCompleted") == false) {
return listItem.get_id();
}
}
return '';
}
......可能是票。
從答案來看,我在這一行上得到了一個錯誤的消息:
var arrayListEnum = oList.getEnumerator();
即,“Uncaught TypeError:oList.getEnumerator不是函數”
是不是沒有這樣的函數名為getEnumerator(),或者...... ???
我仍然得到“Uncaught TypeError:oList.getEnumerator不是一個函數”這個(修改過的)代碼:
function getListItemID(username, payeename, oList) {
var clientContext = new SP.ClientContext.get_current();
var listItems = oList.getItems("");
clientContext.load(listItems);
clientContext.executeQueryAsync(function () {
var arrayListEnum = oList.getEnumerator();
while (arrayListEnum.moveNext()) {
var listItem = arrayListEnum.get_current();
if (listItem.get_item("userName") === "<userName>" &&
listItem.get_item("payeeName") === "<payeeName>" &&
listItem.get_item("Completed") == false) {
return listItem.get_id();
}
}
return '';
});
}
我這樣稱呼它:
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = SP.ClientContext.get_current();
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.website = clientContext.get_web();
currentUser = website.get_currentUser();
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
var travelersEmail = $('traveleremail').val();
/* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem. */
listId = getListItemID(currentUser, travelersEmail, oList);
if (listId === '') {
listId = this.oListItem.ID;
}
那么getEnumerator()是否是一個有效的函數? 如果是的話,我做錯了什么? 如果沒有,我可以用它代替什么?
它可能不像你想的那樣是查詢,但是如下所示:
var clientContext = new SP.ClientContext.get_current();
var listItems = oList.getItems("");
clientContext.load(listItems);
clientContext.executeQueryAsync(function(){
var arrayListEnum = listItems.getEnumerator();
while (arrayListEnum.moveNext()) {
var listItem = arrayListEnum.get_current();
if(listItem.get_item("userName") === "<userName>" &&
listItem.get_item("payeeName") === "<payeeName>" &&
listItem.get_item("Completed") == false) {
return listItem.get_id();
}
}
});
或者您可以像這樣使用CAML查詢:
var query = new SP.CamlQuery();
query.set_viewXml("<View><Query><Where><Contains><FieldRef Name='userName'/>" +
"<Value Type='Text'>userName</Value></Contains></Where></Query>" +
"</View>");
listItems = oList.getItems(query);
clientContext.load(listItems);
clientContext.executeQueryAsync(onQuerySucceeded, function(){Alert("not found");});
...
function onQuerySucceeded() {
var listEnumerator = listItems.getEnumerator();
while (listEnumerator.moveNext()) {
console.log(listEnumerator.get_current().get_id());
}
}
使用REST的CRUD示例
按照SharePoint 2010的要求
RESTful服務的美妙之處- >一切都通過HTTP發生
因此,您可以通過 XMLHttpRequest
使用純JavaScript
或JQuery
通過 $.ajax
或者通過 Sys.Net.WebRequest
MicrosoftAjax.js
正如此示例所示,因為它已在SharePoint 2010 Web部件中可用
// test rest on SharePoint 2010
testREST();
function testREST() {
/*
** List name: Test List (collapse spaces)
** Find list item - Set query in url --> ListName?$filter=
** Or access by list item id --> ListName(id)
*/
invokeRequest({
// make GET request with url query
// REST also allows expansion of lookup fields
// -- here, i check `ModifiedBy` for `[Me]`
'url': "TestList?$filter=" +
"TextColumn eq 'row 1' and " +
"NumberColumn lt 3 and " +
"ModifiedById eq " + _spPageContextInfo.userId,
// GET request
'verb': "GET",
// not needed for GET requests
'body': null,
'match': null,
'method': null,
// on complete
'success': function (jsonObj) {
// check the results of our query, returned in array: jsonObj.d.results
// fyi -- if id used -- ListName(id) -- no array, one object: jsonObj.d
if (jsonObj.d.results.length === 0) {
// nothing found, insert new item
insertItem();
} else {
// check field for _first_ item returned -- NumberColumn
if (jsonObj.d.results[0].NumberColumn < 2) {
// update if less than 2
updateItem(jsonObj.d.results[0]);
} else {
// delete if greater than or equal to 2
deleteItem(jsonObj.d.results[0]);
}
}
},
'fail': function (errCode, errMessage) {
console.log(errCode + ' = ' + errMessage);
},
});
}
function insertItem() {
/*
** List name: Test List
** Insert list item
*/
invokeRequest({
// make POST request for insert
'url': "TestList",
'verb': "POST",
// use MicrosoftAjax.js to serialize our new list item
'body': Sys.Serialization.JavaScriptSerializer.serialize({
// set a key: value according to the column names in the list
Title: "TEST",
TextColumn: "row 1",
EmployeeId: _spPageContextInfo.userId,
NumberColumn: 1,
DateColumn: new Date()
}),
// new item -- match & method not needed
'match': null,
'method': null,
// on complete
'success': function (jsonObj) {
// print new list item to console
var s = '';
for (var key in jsonObj.d) {
if (jsonObj.d.hasOwnProperty(key)) {
s += key + ' = ' + jsonObj.d[key] + '\n';
}
}
console.log('new list item\n' + s);
},
'fail': function (errCode, errMessage) {
console.log(errCode + ' = ' + errMessage);
},
});
}
function updateItem(listItem) {
/*
** List name: Test List
** Update list item
*/
invokeRequest({
// make POST request for insert -- set ID on url
'url': "TestList(" + listItem.Id + ")",
'verb': "POST",
// serialize our updates -- literal w/ field name keys
'body': Sys.Serialization.JavaScriptSerializer.serialize({
Title: listItem.TextColumn + " test",
NumberColumn: Number(listItem.NumberColumn) + 1
}),
// send the -- etag match -- for our update
'match': listItem.__metadata.etag,
// MERGE allows updates to one or more fields
'method': "MERGE",
// on complete
'success': function (jsonObj) {
// print request body -- _updated fields_ -- to console
var newFields = Sys.Serialization.JavaScriptSerializer.deserialize(jsonObj.body);
var s = '';
for (var key in newFields) {
if (newFields.hasOwnProperty(key)) {
s += key + ' = ' + newFields[key] + '\n';
}
}
console.log('updated list item\n' + s);
},
'fail': function (errCode, errMessage) {
console.log(errCode + ' = ' + errMessage);
},
});
}
function deleteItem(listItem) {
/*
** List name: Test List
** Delete list item
*/
invokeRequest({
// make POST request for delete -- set ID on url
'url': "TestList(" + listItem.Id + ")",
'verb': "POST",
// no body needed for delete
'body': null,
// send the match for delete method
'match': listItem.__metadata.etag,
'method': "DELETE",
// on complete
'success': function (jsonObj) {
// print request url for delete request
console.log('deleted list item request\n' + jsonObj.url);
},
'fail': function (errCode, errMessage) {
console.log(errCode + ' = ' + errMessage);
},
});
}
// invoke web request using [MicrosoftAjax.js](https://msdn.microsoft.com/en-us/library/vstudio/bb397536(v=vs.100).aspx)
function invokeRequest(requestObj) {
// new web request
var webRequest = new Sys.Net.WebRequest();
// set request headers
webRequest.get_headers()['Cache-Control'] = 'no-cache';
webRequest.get_headers()['Accept'] = 'application/json';
webRequest.get_headers()['Content-Type'] = 'application/json';
// set etag match
if (requestObj.match !== null) {
webRequest.get_headers()['If-Match'] = requestObj.match;
}
// set method
if (requestObj.method !== null) {
webRequest.get_headers()['X-HTTP-Method'] = requestObj.method;
}
// set request verb
webRequest.set_httpVerb(requestObj.verb);
// set request body
if (requestObj.body !== null) {
webRequest.set_body(requestObj.body);
}
// set request url
webRequest.set_url(
_spPageContextInfo.webServerRelativeUrl + '/_vti_bin/ListData.svc/' + requestObj.url
);
// set user context
webRequest.set_userContext(requestObj);
// set completed callback and invoke request
webRequest.add_completed(serviceComplete);
webRequest.invoke();
}
// process web request
function serviceComplete(executor, args) {
// check response
if (executor.get_responseAvailable()) {
// check status
switch (executor.get_statusCode()) {
case 200: // OK
case 201: // Created
// raise success callback - pass list item
executor.get_webRequest().get_userContext().success(
executor.get_object()
);
break;
case 202: // Accepted
case 203: // Non auth info
case 204: // No content
case 205: // Reset
case 206: // Partial
case 1223: // No content (SP)
// raise success callback - pass original request object
executor.get_webRequest().get_userContext().success(
executor.get_webRequest().get_userContext()
);
break;
// Error
default:
// raise fail callback - pass status
executor.get_webRequest().get_userContext().fail(
executor.get_statusCode(),
executor.get_statusText()
);
}
} else {
// check timeout
if (executor.get_timedOut()) {
executor.get_webRequest().get_userContext().fail(408,'Request Timeout');
} else {
// check abort
if (executor.get_aborted()) {
executor.get_webRequest().get_userContext().fail(800,'Request Aborted');
} else {
executor.get_webRequest().get_userContext().fail(801,'Unknown Error');
}
}
}
}
有關SharePoint 2010中命名約定的更多信息
更多關於spPageContextInfo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.