【问题标题】:One or more field types are not installed properly. Go to the list settings page to delete these fields一种或多种字段类型未正确安装。转到列表设置页面以删除这些字段
【发布时间】:2012-12-11 07:13:13
【问题描述】:
CamlQuery query = new CamlQuery();
query.ViewXml = @"<View>"
    + "<Query>"
    + "<Where><Eq><FieldRef Name='Name' /><Value Type='Text'>"
    + fileName
    + "</Value>"
    + "</Eq>"
    + "</Where>"
    + "</Query>"
    + "</View>";
ListItemCollection item = list.GetItems(query);
clientContext.Load(item);
clientContext.ExecuteQuery();

这个查询给了我错误一个或多个字段类型没有正确安装。转到列表设置页面以删除这些字段。

如果我使用 &lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name='Title' /&gt;&lt;Value Type='Text'&gt; 而不是 Name ,没关系。

它有什么问题? 名称在列表中。

【问题讨论】:

  • 在 SPQuery 中,您必须使用字段的内部名称。请验证名为 what's the internal name of your Name field 的字段。
  • @MarekKembrowski -> 什么是内部名称?抱歉,我对 SharePoint 很陌生。
  • 长话短说 - SharePoint 字段有两种名称 - 显示名称和内部名称。在某些地方(例如SPListItem[string fieldName])必须使用显示名称,在某些地方(例如SPQuery)必须使用内部名称。检查字段的内部名称的最简单方法是转到 SharePoint 网站上的字段定义并检查 url 中的查询字符串。例如:http://localhost/_layouts/FldEdit.aspx?List={F8645DD3-CE80-4ECF-849F-6F851EECA2A7}&amp;Field=LocalNumber 我的Local Number 字段具有内部名称LocalNumber
  • 所以在上传的时候,我们也必须提供内部名称吗?或者它是由 SharePoint 自动创建的?谢谢你的回答!!
  • “上传”是什么意思?大多数情况下,当您创建新字段(列)时,SharePoint 会自动创建内部名称。在某些情况下,您可以强制使用您选择的内部名称(当您从 xml 创建字段时),但大多数情况下,您无法控制它。

标签: sharepoint caml sharepoint-clientobject


【解决方案1】:

如果重命名已定义的列,则内部名称不会更新。例如,您创建一个自定义列表,默认情况下它具有“标题”列。如果您将该列更改为“userId”,则该列的内部名称仍为“Title”。

【讨论】:

    【解决方案2】:

    不确定这是否会修复该错误消息,但这是您可以使用名称的方式:

    名称(对于开箱即用的文档库)内部名称是 "BaseName"

    您可以使用 powershell 查找列表中所有列的内部名称:

    $web = Get-SPWeb http://yoursiteurl
    $web.lists["The List Name"].Fields | FL Title, InternalName
    

    示例查询:

    $query.set_innerXML("<Where><Eq><FieldRef Name='BaseName'></FieldRef><Value Type='Text'>" + $ItemName + "</Value></Eq></Where>")
    

    powershell 中的完整示例:

    function Update-SPItem($proxy, $ItemName, $listName, $lastModified, $firstName, $lastName, $chID, $emplNumber, )
    {          
       $doc = New-Object System.Xml.XmlDocument
       $viewFields = $doc.CreateElement("ViewFields")
       $viewFields.set_innerXML("<FieldRef Name='ID'></FieldRef>")
       $queryOptions = $doc.CreateElement("QueryOptions")
       $queryOptions.set_innerXML("<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns><DateInUtc>FALSE</DateInUtc><ViewAttributes Scope='RecursiveAll'/>")
       $query = $doc.CreateElement("Query")
       $query.set_innerXML("<Where><Eq><FieldRef Name='BaseName'></FieldRef><Value Type='Text'>" + $ItemName + "</Value></Eq></Where>")
       $results = $proxy.GetListItems($listName, "", $query, $viewFields, "", $queryOptions, "")
       $rowXml = $results.GetElementsByTagName("z:row")
       $ItemID = $rowXml.Item(0).GetAttribute("ows_ID")
    
       # Update the item
       $batch = $doc.CreateElement("Batch")
       $batch.SetAttribute("OnError", "Continue")
       $batch.SetAttribute("ListVersion","1")
       $batch.SetAttribute("ViewName", "")
       $batch.InnerXml = "<Method ID='1' Cmd='Update'><Field Name='ID'>" + $ItemID + 
                         "</Field><Field Name='ImageCreateDate'>" + $lastModified + 
                         "</Field><Field Name='FirstName'>" + $firstName + 
                         "</Field><Field Name='LastName'>" + $lastName + 
                         "</Field><Field Name='CardHolderID'>" + $chID + 
                         "</Field><Field Name='EmployeeNumber'>" + $emplNumber + 
                         "</Field></Method>"
    
       $result = $proxy.UpdateListItems($listName, $batch)
    }
    

    【讨论】:

      【解决方案3】:

      如果您通过 SharePoint 2010 列表设置页面创建字段,则字段名称中的任何空格都将成为字段内部名称的 _x0020_ 序列。除空格外,SharePoint 将以类似方式对其他非标准字符进行编码。因此,您会在列表的网页上看到您想要的名称,但编程访问将需要 SharePoint 构建的内部名称(它们应该允许我们指定内部名称...

      @MarekKembrowski 对 Op 的评论告诉了如何使用浏览器获取内部名称。

      【讨论】:

        【解决方案4】:

        我假设您遇到的问题不是&lt;FieldRef Name='Name' /&gt;,而是&lt;Value Type='Text'&gt;。如果您检查名称字段的类型,您会发现它是一个文件。如果有人知道如何查询,我也会很感激。现在我使用的是 Title。

        【讨论】:

        • 我们必须使用内部名称。那我们就没事了。对于名称,它是 。祝你好运!!!
        【解决方案5】:

        对于构造错误的查询(例如在同级元素周围没有最顶层标签的查询)会显示相同的错误消息。

        他们查询:

        <Where><Contains><FieldRef Name='...' /><Value Type='Text'>Foobar</Value></Contains></Where><OrderBy><FieldRef Name='Modified' /></OrderBy>
        

        会给出同样的错误信息,但不会:

        <View><Where><Contains><FieldRef Name='...' /><Value Type='Text'>Foobar</Value></Contains></Where><OrderBy><FieldRef Name='Modified' /></OrderBy></View>
        

        【讨论】:

          【解决方案6】:

          我为此挣扎了太久,答案就在我面前。 对我来说,Marek Kembrowski 对原始问题发表的评论正是我需要做的,但我对它很感兴趣,因为它是评论,所以我将用我自己的话重申 Marek 所说的话,希望与此问题相关的下一个人不会错过上面发布的评论。

          在 sharepoint 中,当您创建列时,有两个文本字段,您可以在其中提供信息来描述字段,列名称和说明。

          让我失望的是,sharepoint 站点设置了列名 [OrderID] 和不同的描述 [CON]。

          在这里,您可以看到 Sharepoint 的外观,其中包含首先创建的 OrderID 和我在发现问题后创建的 OrderID。 . .不同之处在于 OrderID 列名称之一是 OrderID ;)

          我可以看到原始列名的唯一方法是将鼠标悬停在库设置中的列上,就像上面提到的 Marek 一样。 . .这将在浏览器底部显示链接。如果你点击编辑它。 . .这甚至不对。 . .甚至没有显示任何关于真实列名的信息。 . .even 在列名字段中显示描述名称。 . . GGRRRRRRR!!!!!!

          无论如何,这是我用来检索数据的代码:

                  // Starting with ClientContext, the constructor requires a URL to the 
                  // server running SharePoint. 
                  ClientContext context = new ClientContext(siteUrl);
          
                  // The SharePoint web at the URL.
                  Web web = context.Web;
          
                  List docList = context.Web.Lists.GetByTitle("OrderDocuments");
          
                  CamlQuery query2 = new CamlQuery();
          
                  //This query will NOT work . . .CON is not a column in the sharepoint repository
                  //query2.ViewXml = "<View><Query><Where><Eq><FieldRef Name='CON' /><Value Type='Number'>4</Value></Eq></Where></Query></View>";
          
                  //This query WILL WORK.  The actual Column name is OrderID in Sharepoint
                  query2.ViewXml = "<View><Query><Where><Eq><FieldRef Name='OrderID' /><Value Type='Number'>4</Value></Eq></Where></Query></View>";
                  ListItemCollection collListItem = docList.GetItems(query2);
          
                  context.Load(collListItem);
                  context.ExecuteQuery();
          

          +1 给 Marek 以获得上述正确解决方案。我希望我在第一次找到这个页面时就看到了它。

          【讨论】:

            【解决方案7】:

            另一种无需脚本检查内部名称的好方法是转到列表设置并单击要检查的列。您可以将其内部名称视为查询字符串 Field,如下所示。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-04
              • 2013-04-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多