Программно загрузить XSN в SharePoint - PullRequest
0 голосов
/ 17 мая 2011

У меня есть куча шаблонов форм InfoPath (xsn), которые я хочу загрузить программным способом в список SharePoint. Моя программа должна загружать эти шаблоны форм в разные списки на основе предопределенной логики. Когда я загружаю шаблоны форм с поддержкой браузера (xsn) вместе с моим кодом, формы не работают:

/// <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.

ОБНОВЛЕНИЕ Когда я публикую ту же форму в Microsoft InfoPath, она работает.

1 Ответ

4 голосов
/ 15 октября 2012

вы можете использовать этот код для преобразования загруженной формы в форму с поддержкой браузера как:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...