문제

SharePoint Lists Web Service를 호출하여 SharePoint 목록을 업데이트하기 위해 사용자 정의 제출 코드가 포함 된 InfoPath 양식이 있습니다. 코드는 예외없이 실행되며 브레이크 포인트를 설정하여 변수에 웹 서비스로 전송되기 전에 올바른 값이 포함되어 있는지 확인할 수있었습니다. 그러나 값은 SharePoint 목록에 추가되지 않습니다. 내 코드는 다음과 같습니다.

[InfoPathEventHandler(MatchPath = "Submit", EventType = InfoPathEventType.OnClick)]
    public void Submit_OnClick(DocActionEvent e)
    {
        ListsService.Lists listService = new Risk_Form.ListsService.Lists();
        listService.Credentials = System.Net.CredentialCache.DefaultCredentials;

        string riskID = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskID").text;
        string headline = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskHeadline").text;

        XmlDocument doc = new XmlDocument();
        XmlElement batch = doc.CreateElement("Batch");
        batch.SetAttribute("OnError", "Continue");
        batch.SetAttribute("ListVersion", "1");

        batch.InnerXml = 
            "<Method ID='" + riskID + "' Cmd='New'>" +
                "<Field Name='RiskID'>" + riskID + "</Field>" +
                "<Field Name='Headline'>" + headline + "</Field>" + 
            "</Method>";
        try
        {
            // Update list using the list's GUID
            listService.UpdateListItems("2F6CA5F4-D78A-4716-B111-507917CF89E4", batch);
        }
        catch(Exception ex)
        {
            thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskStatement").text = ex.Message;
        }
    }
도움이 되었습니까?

해결책 2

좋아, 나는 마침내이 멍청한 벌레를 알아 냈다. 루트 SharePoint 사이트에 내 하위 사이트에서 액세스하려는 목록과 동일한 디스플레이 이름이있는 목록이있었습니다. 내 서비스 참조가 내 하위 사이트에있는 목록 웹 서비스를 가리키했지만 여전히 잘못된 목록을 반환하고있었습니다. 내 목록에 내부 이름을 사용했는데 이제 작동합니다.

다른 팁

두가지:

  1. updateListItems ()를 호출 할 때 배치에 기본보기 ID가 필요할 수도 있습니다.

  2. List Guid를 하드 코딩하는 대신 ListService.getListAndView ()를 호출하여 프로그래밍 방식으로 얻을 수 있습니다.

다음은 두 항목을 모두 보여주는 몇 가지 코드입니다.

System.Xml.XmlNode ndListView = listService.GetListAndView(DISPLAYNAMEOFLIST, "");
string listGuid = ndListView.ChildNodes[0].Attributes["Name"].Value;
string listView = ndListView.ChildNodes[1].Attributes["Name"].Value;

batch.SetAttribute("ViewName", listView);

그런 다음 ListGuid 및 Batch를 사용하여 UpdatEListItems ()를 호출 할 수 있습니다.

문서에서 MSDN: Curly Braces (예 : "{Guid}")로 둘러싸인 목록 안내서를 사용하는 것이 좋습니다. 그러나 목록 표시 이름도 사용할 수도 있습니다.

그 곱슬 괄호는 당신의 전화에서 누락 된 것 같습니다.

내 문제에 대한 부분적인 대답을 찾았습니다. 작업중인 하위 사이트에 대한 서비스 참조를 추가했을 때 어떤 이유로 app.config에는 루트 SharePoint 사이트에 대한 참조가 포함되어 있습니다. 따라서 내가 찾고 있던 목록은 존재하지 않았습니다. 그래도 또 다른 문제가 있습니다. UpdatEListItems () 호출의 반환 값을 확인하고 다음과 같은 오류가 발생합니다. "하나 이상의 필드 유형이 제대로 설치되지 않았습니다. 목록 설정 페이지로 이동하여 이러한 필드를 삭제하십시오." 나는 검색 했고이 오류를 일으키는 모든 문제는 그 안에 공간이있는 필드 이름을 갖는 것 같습니다. 그러나 내 필드 중 어느 것도 그 안에 공간이 없습니다. 내 업데이트 코드는 다음과 같습니다.

        ListsService.Lists listService = new Risk_Form.ListsService.Lists();
        listService.Credentials = System.Net.CredentialCache.DefaultCredentials;
        XmlNode list = null;

        list = listService.GetListAndView("Risks", "");

        string listID = list.ChildNodes[0].Attributes["Name"].Value;
        string viewID = list.ChildNodes[1].Attributes["Name"].Value;

        string riskID = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskID").text;
        string headline = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskHeadline").text;

        XmlDocument doc = new XmlDocument();
        XmlElement batch = doc.CreateElement("Batch");
        batch.SetAttribute("OnError", "Continue");
        batch.SetAttribute("ListVersion", "1");
        batch.SetAttribute("ViewName", viewID);

        batch.InnerXml = 
            "<Method ID='1' Cmd='New'>" +
                "<Field Name='RiskID'>" + riskID + "</Field>" +
                "<Field Name='Headline'>" + headline + "</Field>" + 
            "</Method>";

        XmlNode ret = listService.UpdateListItems(listID, batch);
        MessageBox.Show(ret.OuterXml);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top