Pergunta

Eu tenho um formulário do InfoPath com o costume submeter código para atualizar uma lista Sharepoint chamando o serviço de listas web Sharepoint. O código é executado sem quaisquer excepções, e eu era capaz de pontos de interrupção conjunto para se certificar de que as variáveis ??contêm os valores corretos antes de ser enviado para o serviço web. Os valores nunca são adicionados à lista Sharepoint, no entanto. Aqui está o meu código:

[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;
        }
    }
Foi útil?

Solução 2

Ok, eu finalmente descobri isso bug estúpido. Havia uma lista no site do SharePoint raiz com o mesmo nome de exibição como a lista Eu estava tentando acessar no meu subsite. Mesmo que a minha referência de serviço apontou para o serviço de listas web localizado no meu subsite, ele ainda estava retornando a lista errada. Eu usei o nome interno para minha lista e agora ele funciona.

Outras dicas

Duas coisas:

  1. Você também pode precisar o padrão Ver ID em seu lote ao chamar UpdateListItems ().

  2. Em vez de codificar a lista guid, você pode obtê-lo através de programação chamando listService.GetListAndView ().

Aqui está um código para demonstrar ambos os itens:

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);

Você pode então apenas chamar UpdateListItems () com listGuid e lote.

A partir da documentação on MSDN : < em> é recomendável que você use a lista GUID cercada por chaves (isto é, "{GUID}"), mas você também pode usar o nome de exibição lista.

As chaves parecem estar faltando em sua chamada.

Eu encontrei uma resposta parcial para o meu problema. Quando eu adicionei a referência de serviço ao subsite Eu estou trabalhando em, por algum motivo app.config ainda continha uma referência para o site Sharepoint raiz. Portanto não existia a lista que eu estava procurando. Agora eu estou tendo um outro problema, no entanto. I verificar o valor de retorno dos UpdateListItems () chamada, e eu recebo o seguinte erro: "Um ou mais tipos de campo não estão instalados corretamente Ir para a página da lista de configurações para excluir esses campos.". Eu procurei ao redor e todos os problemas que causam esse erro parecem envolver ter um nome de campo com um espaço nele. Nenhum dos meus campos têm espaços entre eles, no entanto. Aqui está o meu código atualizado:

        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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top