Pregunta

Tengo un formulario de InfoPath con un código de envío personalizado para actualizar una lista de Sharepoint llamando al servicio web de Listas de Sharepoint. El código se ejecuta sin ninguna excepción, y pude establecer puntos de interrupción para asegurarme de que las variables contienen los valores correctos antes de enviarlas al servicio web. Sin embargo, los valores nunca se agregan a la lista de Sharepoint. Aquí está mi 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;
        }
    }
¿Fue útil?

Solución 2

Ok, finalmente descubrí este estúpido error. Había una lista en el sitio raíz de Sharepoint con el mismo nombre para mostrar que la lista a la que intentaba acceder en mi subsitio. Aunque mi referencia de servicio apuntaba al servicio web de Listas ubicado en mi subsitio, seguía devolviendo la lista incorrecta. Utilicé el nombre interno para mi lista y ahora funciona.

Otros consejos

Dos cosas:

  1. Es posible que también necesite la ID de vista predeterminada en su lote cuando llame a UpdateListItems ().

  2. En lugar de codificar el guid de la lista, puede obtenerlo programáticamente llamando a listService.GetListAndView ().

Aquí hay un código para demostrar ambos elementos:

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

Puede simplemente llamar a UpdateListItems () con listGuid y batch.

De la documentación en MSDN : < em> Se recomienda que use el GUID de la lista rodeado de llaves (es decir, " {GUID} "), pero también puede usar el nombre para mostrar de la lista.

Parece que faltan esas llaves en tu llamada.

Encontré una respuesta parcial a mi problema. Cuando agregué la referencia de servicio al subsitio en el que estoy trabajando, por alguna razón app.config todavía contenía una referencia al sitio raíz de Sharepoint. Por lo tanto, la lista que estaba buscando no existía. Ahora tengo otro problema, sin embargo. Compruebo el valor de retorno de la llamada UpdateListItems () y aparece el siguiente error: " Uno o más tipos de campo no están instalados correctamente. Vaya a la página de configuración de la lista para eliminar estos campos. & Quot; Busqué y todos los problemas que causan este error parecen implicar tener un nombre de campo con un espacio en él. Sin embargo, ninguno de mis campos tiene espacios en ellos. Aquí está mi código actualizado:

        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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top