【问题标题】:Why does <ViewFields> criteria get ignored by the SharePoint List Service's GetListItems Method为什么 SharePoint 列表服务的 GetListItems 方法会忽略 <ViewFields> 条件
【发布时间】:2015-01-15 01:24:01
【问题描述】:

尽管我在共享点列表服务的 GetListItems 查询中指定了 ViewFields 元素,但仍会返回所有字段。以下代码构建请求:

XmlDocument xmlDoc = new System.Xml.XmlDocument();
XmlNode query = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
XmlNode viewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
XmlNode queryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");    

... set query ...

viewFields.InnerXml = "<FieldRef Name='LinkFilename' /><FieldRef Name='FileDirRef' /><FieldRef Name='FileLeafRef' />";            

queryOptions.InnerXml = "<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns><DateInUtc>TRUE</DateInUtc><Folder>Resource Management Tools</Folder><ViewAttributes Scope='Recursive' />";

XmlNode xmlNode = SharePointListWebService.GetListItems(
_listServiceConfigurationSettings.ListName,
                                string.Empty,
                                query,
                                viewFields,
                                null,
                                queryOptions,
                                null);

根据 fiddler 的说法,这会导致将以下肥皂信封发布到列表服务:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">    
      <listName>Shared Documents</listName>
      <viewName />
      <query>
        <Query xmlns="">
          <Where>
            <And>
              <Contains>
                <FieldRef Name="FileLeafRef" />
                <Value Type="Text">.xls</Value>
              </Contains>
              <Geq>
                <FieldRef Name="Modified"
                IncludeTimeValue="True" />
                <Value Type="DateTime">2010-05-10T11:53:32Z</Value>
              </Geq>
            </And>
          </Where>
          <OrderBy>
            <FieldRef Name="FileDirRef" />
          </OrderBy>
        </Query>
      </query>
      <viewFields>
        <ViewFields xmlns="">
          <FieldRef Name="LinkFilename" />
          <FieldRef Name="FileDirRef" />
          <FieldRef Name="FileLeafRef" />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions xmlns="">
          <IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>
          <DateInUtc>TRUE</DateInUtc>
          <Folder>Resource Management Tools</Folder>
          <ViewAttributes Scope="Recursive" />
        </QueryOptions>
      </queryOptions>
    </GetListItems>
  </soap:Body>
</soap:Envelope>

以及从服务返回的以下soap响应:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetListItemsResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <GetListItemsResult>
        <listitems xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
        xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
        xmlns:rs='urn:schemas-microsoft-com:rowset'
        xmlns:z='#RowsetSchema'>
          <rs:data ItemCount="19">
            <z:row ows_LinkFilename='[SENSITIVE DATA].xls'
            ows_FileDirRef='278;#sites[SENSITIVE DATA]'
            ows_FileLeafRef='278;#[SENSITIVE DATA].xls'
            ows_MetaInfo='278;#Subject:SW| vti_parserversion:SR|12.0.0.6421 ContentTypeId:SW|0x0101006C2E647253A1074FB6079F08E5F2A395 _Author:SW|[SENSITIVE DATA] _Category:SW| vti_author:SR|[SENSITIVE DATA] _Comments:SW| vti_approvallevel:SR| vti_categories:VW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject vti_assignedto Keywords _Author _Category _Comments vti_assignedto:SR| Keywords:SW| vti_modifiedby:SR|[SENSITIVE DATA]'
            ows__ModerationStatus='0' ows__Level='1'
            ows_Last_x0020_Modified='278;#2010-06-29T18:55:38Z'
            ows_ID='278' ows_owshiddenversion='53'
            ows_UniqueId='278;#{0E51B2B1-89A7-4895-8ECC-0FE7D420470C}'
            ows_FSObjType='278;#0'
            ows_Created_x0020_Date='278;#2009-03-09T16:06:41Z'
            ows_ProgId='278;#' ows_Modified='2010-06-29T18:55:37Z'
            ows_FileRef='278;#sites[SENSITIVE DATA].xls'
            ows_DocIcon='xls'
            ows_Editor='262;#[SENSITIVE DATA]' />            
          </rs:data>
        </listitems>
      </GetListItemsResult>
    </GetListItemsResponse>
  </soap:Body>
</soap:Envelope>

请注意,z:row 元素包含的字段比我在 ViewFields 条件中指定的要多。我还在查询选项中将 IncludeMandatoryColumns 设置为 false。我是不是做错了什么,还是我不明白 ViewFields 是如何工作的,因为我认为它会限制字段,即 SharePoint 列表服务返回的 z:row 属性。

【问题讨论】:

    标签: sharepoint


    【解决方案1】:

    我也一直在努力解决这个问题。今晚我找到了一个似乎对我有用的解决方案……希望它对其他人也有帮助。

    你的 viewFields 节点的结构很好......

       <viewFields>
        <ViewFields xmlns="">
          <FieldRef Name="LinkFilename" />
          <FieldRef Name="FileDirRef" />
          <FieldRef Name="FileLeafRef" />
        </ViewFields>
      </viewFields>
    

    问题可能出在您的字段名称上。显然,您必须使用内部名称而不是显示名称。确定内部名称的一种快速简便的方法是转到列表的“列表设置”页面并将鼠标悬停在列表中的每一列上。浏览器的状态栏会显示一个类似这样的 URL..

    http://YOUR_SITE/_layouts/FldEdit.aspx?List=%7B12345678%2D1234%2D1234%2D1234%2D123456789012%7D&Field=INTERNAL_FIELD_NAME
    

    为您希望从 GetListItems() 服务返回的每个字段使用此处显示的内部字段名称。例如,

    <FieldRef Name="LinkFilename" />
    

    ....可能需要写成...

    <FieldRef Name="Link_x0020_Filename" />
    

    至少这就是为我解决问题所需要的。希望对您有所帮助!

    【讨论】:

    • 这对你有用吗?我很好奇是否还有其他可能导致此类错误的问题。谢谢!
    【解决方案2】:

    为此目的有一个ViewFieldsOnly 属性(虽然我没有尝试过)。

    当您通过设置 ViewFields 属性指定字段时,查询检索的数据不仅仅是这些字段。为了优化性能,您可以通过将 ViewFieldsOnly 属性设置为 true 来限制查询返回的数据。

    【讨论】:

      【解决方案3】:

      没有做任何我自己的研究,看起来你正在生成以下 XML 节点:

        <viewFields>
          <ViewFields xmlns="">
            <FieldRef Name="LinkFilename" />
            <FieldRef Name="FileDirRef" />
            <FieldRef Name="FileLeafRef" />
          </ViewFields>
        </viewFields>
      

      您的意思是将您的ViewFields 元素嵌入到另一个viewFields 元素中吗?

      【讨论】:

      • 嵌套的 viewFields/ViewFields 由 Web 服务代理生成。在 fiddler 中重放请求(soap post)时,我发现 viewFields 是可选的,但是如果我删除 ViewFields,服务器会返回一个 soap 错误
      • 在 SOAP 中是必需的 -- 一个蹩脚的设计,但就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2014-05-16
      • 2021-10-20
      • 2022-07-14
      • 1970-01-01
      相关资源
      最近更新 更多