2011-05-17 65 views
0

我有一堆InfoPath表單模板(xsn),我想以編程方式上傳到SharePoint列表。我的程序必須根據預定義的邏輯將這些表單模板上傳到不同的列表。當我上傳我的代碼的瀏覽器啓用表單模板(XSN),形式不工作:以編程方式將XSN上傳到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; 
} 

似乎有更多的事情要做,只是按下一個文件流進榜。

任何人都有一個想法如何做到這一點?

編輯更具體地說,該錯誤消息我得到的是:This form template is not enabled for viewing in the browser.

UPDATE當我發佈與微軟的InfoPath相同的形式它的工作原理。

+0

從錯誤信息該表單可能會有所幫助。 – 2011-05-17 15:21:52

+0

謝謝....更新。 – 2011-05-17 16:31:54

+0

您的表單是否真正啓用瀏覽器查看? – 2011-05-18 07:47:56

回答

4

您可以使用此代碼到您上傳的形式轉換成瀏覽器啓用形式:

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

,或者你可以使用這個鏈接查看更多細節爲:

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

+0

謝謝@Avanish!我還沒有機會嘗試一下。該項目停放了一段時間,所以我不得不將它從檔案中取出並試用。 – 2012-10-24 19:28:44