在没有BinarySerializedWebPart元素的情况下以声明方式部署BrowserFormWebPart

时间:2011-05-17 15:41:32

标签: sharepoint-2010 infopath

有没有人知道是否有办法使用标准的AllUsersWebPart元素和属性的CDATA部分来部署BrowserFormWebPart(列表内容类型的自定义InfoPath表单)?到目前为止,我尝试过没有成功。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

经过2天的研究 - 以下代码工作

  private void UpdateInfoPathForms(SPSite oSite)
    {
        UpdateInfoPath(oSite, "Lists/Audit Calendar/Item/newifs.aspx");
        UpdateInfoPath(oSite, "Lists/Audit Calendar/Item/displayifs.aspx");
        UpdateInfoPath(oSite, "Lists/Audit Calendar/Item/editifs.aspx");
    }

    private void UpdateInfoPath(SPSite oSite, string formFileLocation)
    {
        var file = oSite.RootWeb.GetFile(formFileLocation);

        using (SPLimitedWebPartManager manager = file.GetLimitedWebPartManager(System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared))
        {
            try
            {
                var wp1 = new Microsoft.Office.InfoPath.Server.Controls.WebUI.BrowserFormWebPart();

                wp1.SubmitBehavior = Microsoft.Office.InfoPath.Server.Controls.WebUI.SubmitBehavior.FormDefault;
                wp1.FormLocation = "~list/Item/template.xsn";
                wp1.ContentTypeId = oSite.RootWeb.Lists["Audit Calendar"].ContentTypes["Item"].Id.ToString();

                IListWebPart listWebpart = wp1 as IListWebPart;

                listWebpart.ListId = oSite.RootWeb.Lists["Audit Calendar"].ID;

                if (formFileLocation.Contains("newifs.aspx"))
                {
                    listWebpart.PageType = PAGETYPE.PAGE_NEWFORM;
                }
                else if (formFileLocation.Contains("displayifs.aspx"))
                {
                    wp1.ListFormMode = Microsoft.Office.InfoPath.Server.Controls.WebUI.ListFormMode.ReadOnly;
                    listWebpart.PageType = PAGETYPE.PAGE_DISPLAYFORM;

                }
                else if (formFileLocation.Contains("editifs.aspx"))
                {
                    listWebpart.PageType = PAGETYPE.PAGE_EDITFORM;
                }
                listWebpart.ViewFlags = SPViewFlags.None;

                manager.AddWebPart(wp1, "Main", 0);
                manager.SaveChanges(wp1);
            }
            finally
            {
                manager.Web.Dispose();
            }
        }

答案 1 :(得分:0)

我遇到了同样的问题。这是我试过的:

<AllUsersWebPart WebPartZoneID="Main" WebPartOrder="2">
    <![CDATA[
    <webParts>
        <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
            <metaData>
                <type name="Microsoft.Office.InfoPath.Server.Controls.WebUI.BrowserFormWebPart, Microsoft.Office.InfoPath.Server, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
                <importErrorMessage>Cannot import this Web Part.</importErrorMessage>
            </metaData>
            <data>
                <properties>
                    <property name="ChromeType" type="chrometype">None</property>
                    <property name="HelpMode" type="helpmode">Modeless</property>
                    <property name="ChromeState" type="chromestate">Normal</property>
                </properties>
            </data>
        </webPart>
    </webParts>]]>
</AllUsersWebPart>

然后我有一个功能接收器来配置Web部件:

using (SPLimitedWebPartManager manager = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
{
    try
    {
        BrowserFormWebPart webpart = GetWebPart(manager);
        webpart.SubmitBehavior = SubmitBehavior.FormDefault;
        webpart.FormLocation = "~list/MyList/template.xsn";
        webpart.ContentTypeId = "0x01003C8AD6E14DAD5342BBFAA84E63F8022C";
        manager.SaveChanges(webpart);
    }
    finally
    {
        manager.Web.Dispose();
    }
}

要获取要显示的表单,需要使用BrowserFormWebPart属性,但由于某种原因,在AllUsersWebPart部分中设置这些属性不起作用。表单显示,我可以填写它,但表单中的值不会插入列表项的字段中。我将以下部分添加到功能接收器中,以尝试将表单绑定到列表项的字段中:

IListWebPart listWebpart = webpart as IListWebPart;
listWebpart.PageType = PAGETYPE.PAGE_EDITFORM;
listWebpart.ViewFlags = SPViewFlags.None;

不幸的是,没有快乐。这就是我所拥有的。希望你能有更好的运气。