2011-05-17 4 views
0

J'ai un tas de modèles de formulaires InfoPath (xsn) que je veux télécharger dans une liste SharePoint par programmation. Mon programme doit télécharger ces modèles de formulaires dans différentes listes en fonction d'une logique prédéfinie. Lorsque je télécharger les modèles de formulaire compatibles avec les navigateurs (XSN) avec mon code, les formulaires ne fonctionnent pas:Téléverser par programmation XSN vers SharePoint

/// <summary> 
/// Uploads a file to the specified sharepoint list 
/// </summary> 
/// <param name="listName"></param> 
/// <param name="fileInfo"></param> 
/// <param name="listVersion"></param> 
/// <returns></returns> 
public static bool UploadFile(string listName, FileInfo fileInfo, string listVersion) 
{ 
    WebRequest request = WebRequest.Create(fileInfo.URL); 
    request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
    request.Method = "PUT"; 
    byte[] buffer = new byte[1024]; 
    using (Stream stream = request.GetRequestStream()) 
    { 
     using (MemoryStream ms = new MemoryStream(fileInfo.Bytes)) 
     { 
      for (int i = ms.Read(buffer, 0, buffer.Length); i > 0; i = ms.Read(buffer, 0, buffer.Length)) 
       stream.Write(buffer, 0, i); 
     } 
    } 
    WebResponse response = request.GetResponse(); 
    response.Close(); 

    var client = new Lists.ListsSoapClient(); 
    var batch = new XElement("Batch", 
     new XAttribute("OnError", "Continue"), 
     new XAttribute("ListVersion", listVersion), 
     new XAttribute("PreCalc", "TRUE")); 

    var method = new XElement("Method", 
     new XAttribute("ID", "1"), 
     new XAttribute("Cmd", "Update"), 
     new XElement("Field", 
      new XAttribute("Name", "ID")), 
     new XElement("Field", 
      new XAttribute("Name", "FileRef"), 
      fileInfo.URL)); 

    foreach (string key in fileInfo.Properties.Keys) 
    { 
     object value = fileInfo.Properties[key]; 

     method.Add(new XElement("Field", 
      new XAttribute("Name", key), 
      fileInfo.Properties[key])); 
    } 
    batch.Add(method); 

    var element = client.UpdateListItems(listName, batch); 

    var code = element.Elements().First().Elements().First().Value; 
    if (code != "0x00000000") 
     throw new Exception(code); 
    return true; 
} 

Il semble qu'il y ait plus à faire que simplement pousser un flux de fichier dans la liste.

Est-ce que quelqu'un a une idée pour faire cela?

EDIT Plus précisément, le message d'erreur que je reçois est: This form template is not enabled for viewing in the browser.

MISE À JOUR Lorsque je publie la même forme avec Microsoft InfoPath cela fonctionne.

+0

Un message d'erreur le formulaire pourrait être utile. –

+0

Merci .... mis à jour. –

+0

Votre formulaire est-il réellement activé pour l'affichage du navigateur? –

Répondre

4

vous pouvez utiliser ce code pour convertir votre formulaire téléchargé dans le navigateur sous forme activée comme:

FormsService localFormsService; 
SPFarm localFarm = SPFarm.Local; 
SPSite localSite = new SPSite("http://ServerName"); 
SPWeb localWeb = localSite.AllWebs["SiteName"]; 
try 
{ 
    localFormsService = localFarm.Services.GetValue<FormsService>(FormsService.ServiceName); 
    SPFile localFile = localWeb.GetFile("FormLibrary/Forms/FormTemplate.xsn"); 
    localFormsService.BrowserEnableUserFormTemplate(localFile); 
    Console.Write("Press Enter to Continue"); 
    Console.ReadLine(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Error: " + ex.Message); 
    Console.Write("Press Enter to Continue"); 
    Console.ReadLine(); 
} 

ou vous pouvez utiliser ce lien pour plus de détails comme:

http://msdn.microsoft.com/en-us/library/microsoft.office.infopath.server.administration.formsservice.browserenableuserformtemplate.aspx

+0

Merci @Avanish! Je n'ai pas encore eu l'occasion de l'essayer. Le projet a été garé il y a quelque temps, je vais donc devoir le retirer des archives et l'essayer. –

Questions connexes