在HyperLink字段的SharePoint列表中查找项目

问题描述

我查看了尽可能多的示例,并尝试了不同的组合来解决看似简单的问题-我想根据URL(超链接)字段检查是否存在O365现代列表项。我的CAML如下所示,但未返回任何结果-列表项的URL字段是完整的url,而url变量是也包含完整URL的文本字段。我也尝试过Eq和Contains。

"<View>
<Query>
<Where>
<BeginsWith>
<FieldRef Name='URL'/><Value Type='URL'>" + url + "
</Value>
</BeginsWith>
</Where>
</Query>
</View>"

谢谢

约翰。

完整代码

var OnePlaceURL = TenantBaseURL + "/sites/" + "oneplacesolutions";
            var clientSiteRelativePath = "/sites/" + alias; //Even though the list has the full URL the CAML query has to give a relative path - oddity of SP URL field
            var registerList = "DMS Clients";
                
            try
            {
                using (var context = new ClientContext(OnePlaceURL))
                {
                    context.Credentials = SPOCredentials;
                    Web web = context.Web;
                    context.Load(context.Web,w => w.Url);
                    context.ExecuteQueryRetry();


                    AddLogMessage(MessageLevel.Info,"AddSitetoOnePlaceSolutionsCentralRegister - loaded web" + context.Web.Url);

                    var targetList = context.Web.Lists.GetByTitle(registerList);
                    context.Load(targetList);
                    context.Load(targetList.Fields);
                    context.Load(targetList.GetItemById(1));
                    context.ExecuteQueryRetry();

                    AddLogMessage(MessageLevel.Info,"AddSitetoOnePlaceSolutionsCentralRegister - loaded list and fields,itemCount:" + targetList.ItemCount);
                    

                    CamlQuery query = new CamlQuery();
                    query.ViewXml = "<View><Query><Where><Eq><FieldRef Name='URL'/><Value Type='URL'>" + url + "</Value></Eq></Where></Query></View>";
                    AddLogMessage(MessageLevel.Info,"ViewXML:" + query.ViewXml);

                    var itemList = targetList.GetItems(query);
                    context.Load(itemList); // loading all the fields   

                    context.ExecuteQueryRetry();

解决方法

正如我测试的那样,如果我们在列表中添加外部网站的网址,我们可以像这样使用caml:

<View><Query><Where><Eq><FieldRef Name='link' /><Value Type='URL'>http://www.google.com</Value></Eq></Where></Query></View>

如果我们在列表中添加一些内部站点url,则需要创建如下所示的caml:

<View><Query><Where><Eq><FieldRef Name='link' /><Value Type='URL'>/sites/dev/subsite</Value></Eq></Where></Query></View>

我们不需要添加租户网址。

更多参考:

https://social.msdn.microsoft.com/Forums/office/en-US/2dc874ed-3a3d-4f26-b932-afb25c0142c8/caml-query-on-url-field?forum=sharepointdevelopmentlegacy

已更新:

<script type="text/javascript">

    SP.SOD.executeOrDelayUntilScriptLoaded(ValidateForm,"sp.js");

function ValidateForm(){

   
    var clientContext = new SP.ClientContext();
    var list = clientContext.get_web().get_lists().getByTitle("test3");
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml(
        "<View><Query> <Where><Eq><FieldRef Name='link' /><Value Type='Url'>/sites/dev/subsite</Value></Eq></Where></Query></View>");
    var items = list.getItems(camlQuery);
    clientContext.load(items);
    clientContext.executeQueryAsync(Function.createDelegate(this,onSuccess),Function.createDelegate(this,onFail));
    function onSuccess(){
        
        var ListEnumerator = items.getEnumerator();
        while (ListEnumerator.moveNext()) {
        var currentItem = ListEnumerator.get_current();
        var link= currentItem.get_item("link");
        console.log(link);
     }
        
    }
    function onFail(sender,args){
    console.log(args.get_message());
    }
}

</script>