如何在 Sharepoint App 中检索 Sharepoint 列表?
How to retrieve Sharepoint List in Sharepoint App?
我的网站内容中有我的应用程序和列表,如下所示:
我想在我的应用程序中读取、写入和操作来自 TestList 的数据。
TestList的内容是这样的:
我一直在尝试用这个来阅读它:
function setup() {
var context = SP.ClientContext.get_current();
var lists = context.get_web().get_lists();
var list = lists.getByTitle('TestList');
var listItem = list.getItemById("Title1"); // is Id the list title?
context.load(listItem);
context.executeQueryAsync(onLoadSuccess, onLoadFail);
console.log(listItem);
}
function onLoadFail(sender, args) {
alert(args.get_message());
console.log(args.get_message());
};
以及概述的其他一些方法 here and here,但我经常遇到错误:
List 'TestList' does not exist at site with URL
'https://mysite.sharepoint.com/sites/developer/TestApp'.
我认为这可能与 TestList 是与 TestApp 处于同一目录级别的应用程序有关,而不是 TestApp 中的列表,这就是我包含图片的原因。但是,我不知道如何在 TestApp 中嵌入 TestList。
我在应用程序中创建列表的另一个问题是,每当我更新和重新部署 TestApp 时,它都会擦除对 TestList 的任何新更新。
有人可以看出我做错了什么或提供一些建议吗?提前致谢。
我认为您的方向是正确的。您似乎想使用主机网络上的列表,但您使用的是 appweb 端点。我可以想到两个选项:
- 在您的应用程序中创建一个列表实例(转到 Visual Studio 中添加项目,您可以 select SharePoint 项目并选择一个列表)然后该列表将存在于 appweb 中您部署应用程序。正如您所说,这将在您重新部署应用程序时清除列表,因为它将卸载并重新安装该应用程序。如果您正在生产中,则更新应用程序不会做同样的事情。
- 跨域调用主机网站并直接使用主机网站列表。根据应用程序的性质,这可能是更好的解决方案。请记住,您必须确保为您的应用程序设置权限以拥有网站集的权限,以便调用正常工作,然后您必须捕获主机上下文才能使用主机 SP.Web 对象.我认为 this link 可能会有帮助。
您需要使用正确的 ClientContext。
var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));
currentcontext = new SP.ClientContext.get_current();
hostcontext = new SP.AppContextSite(currentcontext, hostUrl);
web = hostcontext.get_web(); // hostcontext instead of currentcontext
var lists = web .get_lists();
var list = lists.getByTitle('TestList');
var listItem = list.getItemById(1); // Id is Id (number)
context.load(listItem);
context.executeQueryAsync(onLoadSuccess, onLoadFail);
我的网站内容中有我的应用程序和列表,如下所示:
我想在我的应用程序中读取、写入和操作来自 TestList 的数据。
TestList的内容是这样的:
我一直在尝试用这个来阅读它:
function setup() {
var context = SP.ClientContext.get_current();
var lists = context.get_web().get_lists();
var list = lists.getByTitle('TestList');
var listItem = list.getItemById("Title1"); // is Id the list title?
context.load(listItem);
context.executeQueryAsync(onLoadSuccess, onLoadFail);
console.log(listItem);
}
function onLoadFail(sender, args) {
alert(args.get_message());
console.log(args.get_message());
};
以及概述的其他一些方法 here and here,但我经常遇到错误:
List 'TestList' does not exist at site with URL 'https://mysite.sharepoint.com/sites/developer/TestApp'.
我认为这可能与 TestList 是与 TestApp 处于同一目录级别的应用程序有关,而不是 TestApp 中的列表,这就是我包含图片的原因。但是,我不知道如何在 TestApp 中嵌入 TestList。
我在应用程序中创建列表的另一个问题是,每当我更新和重新部署 TestApp 时,它都会擦除对 TestList 的任何新更新。
有人可以看出我做错了什么或提供一些建议吗?提前致谢。
我认为您的方向是正确的。您似乎想使用主机网络上的列表,但您使用的是 appweb 端点。我可以想到两个选项:
- 在您的应用程序中创建一个列表实例(转到 Visual Studio 中添加项目,您可以 select SharePoint 项目并选择一个列表)然后该列表将存在于 appweb 中您部署应用程序。正如您所说,这将在您重新部署应用程序时清除列表,因为它将卸载并重新安装该应用程序。如果您正在生产中,则更新应用程序不会做同样的事情。
- 跨域调用主机网站并直接使用主机网站列表。根据应用程序的性质,这可能是更好的解决方案。请记住,您必须确保为您的应用程序设置权限以拥有网站集的权限,以便调用正常工作,然后您必须捕获主机上下文才能使用主机 SP.Web 对象.我认为 this link 可能会有帮助。
您需要使用正确的 ClientContext。
var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));
currentcontext = new SP.ClientContext.get_current();
hostcontext = new SP.AppContextSite(currentcontext, hostUrl);
web = hostcontext.get_web(); // hostcontext instead of currentcontext
var lists = web .get_lists();
var list = lists.getByTitle('TestList');
var listItem = list.getItemById(1); // Id is Id (number)
context.load(listItem);
context.executeQueryAsync(onLoadSuccess, onLoadFail);