UserControl属性和WebPartsTemplate值丢失

时间:2011-01-04 15:34:30

标签: asp.net user-controls web-parts

我正在尝试将UserControl添加到webparts CatalogZone,但是当用户选择要添加到显示的控件时,我分配给控件的属性值将丢失(或不会保留到显示中)。如果我在WebPartZone中显式声明了相同的控件定义,则属性值将保持不变。我已逐步完成代码,发现当从CatalogZone中选择并随后从个性化数据库加载的控件时,我定义的值将丢失/遗忘/放弃。请参阅下面的代码。

TestPage.aspx

<%@ Register Src="~/UserControls/TestControl.ascx"TagName="TestControl" TagPrefix="test"  %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:WebPartManager ID="WebPartManager1" runat="server">
</asp:WebPartManager>
<asp:DropDownList ID="ddlListModes" runat="server" AutoPostBack="true" />  
<asp:WebPartZone ID="WebPartZone1" runat="server">
    <ZoneTemplate>            
        <test:TestControl ID="TestControl1" runat="server" FontBold="true" />     
    </ZoneTemplate>
</asp:WebPartZone>
<asp:CatalogZone ID="CatalogZone1" runat="server">
    <ZoneTemplate>
        <asp:DeclarativeCatalogPart ID="dcp1" runat="server">
            <WebPartsTemplate>
                <test:TestControl ID="TestControl2" runat="server" FontBold="true" />  
            </WebPartsTemplate>
        </asp:DeclarativeCatalogPart>
    </ZoneTemplate>
</asp:CatalogZone>
</asp:Content>

因此,在上面的代码中,对于WebPartZone.ZoneTemplate中定义的TestControl1,FontBold的值通过控件实例化持续存在,而usercontrol的font-bold属性设置为true。

对于在CatalogZone.ZoneTemplate.DeclarativeCatalogPart.WebPartsTemplate中定义的TestControl2,FontBold的值不会通过控件实例化持久存在,并且永远不会设置usercontrol的FontBold值。

我已经尝试使用ViewState,ControlState等来保存值,认为它不是持久的回发,但问题出在此之前,因为FontBold值永远不会设置{}。

有什么想法吗?

感谢您花时间阅读并回复。

赖安

代码的其余部分

TestPage.aspx.cs

public partial class WebPartTest : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        Page.InitComplete += new EventHandler(BindDdlListModes);
        ddlListModes.SelectedIndexChanged += new EventHandler(ddlListModes_SelectedIndexChanged);
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void BindDdlListModes(object sender, EventArgs e)
    {
        WebPartManager wpm = WebPartManager.GetCurrentWebPartManager(Page);
        string browseModeName = WebPartManager.BrowseDisplayMode.Name;

        ddlListModes.Items.Clear();

        foreach (WebPartDisplayMode mode in wpm.SupportedDisplayModes)
        {
            if (mode.IsEnabled(wpm))
            {
                ListItem item = new ListItem(mode.Name);
                ddlListModes.Items.Add(item);
            }
        }

        int index = ddlListModes.Items.IndexOf(ddlListModes.Items.FindByText(wpm.DisplayMode.Name));
        ddlListModes.SelectedIndex = index;
    }

    protected void ddlListModes_SelectedIndexChanged(object sender, EventArgs e)
    {
        WebPartManager wpm = WebPartManager.GetCurrentWebPartManager(Page);
        WebPartDisplayMode displayMode = wpm.SupportedDisplayModes[ddlListModes.SelectedValue];

        if (displayMode != null)
            wpm.DisplayMode = displayMode;

    }
}

TestControl.ascx.cs 的 该控件只包含一个标签,我通过FontBold属性设置Font-bold值。

public partial class TestControl : System.Web.UI.UserControl
{           
    public bool FontBold { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (FontBold)
            lblText.Font.Bold = true;
    }


}

1 个答案:

答案 0 :(得分:1)

我现在没有机会检查,但在我看来,FoldBold属性应该用Personalizable(),WebBrowsable()属性标记。