UserControl 属性和 WebPartsTemplate,值丢失

Posted

技术标签:

【中文标题】UserControl 属性和 WebPartsTemplate,值丢失【英文标题】:UserControl properties and the WebPartsTemplate, values lost 【发布时间】:2011-06-03 11:33:51 【问题描述】:

我正在尝试将 UserControls 添加到 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 的值通过控件实例化保持不变,并且用户控件的 font-bold 属性设置为 true。

对于在 CatalogZone.ZoneTemplate.DeclarativeCatalogPart.WebPartsTemplate 中定义的 TestControl2,FontBold 的值不会通过控件实例化保持不变,并且永远不会设置用户控件的 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】:

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

【讨论】:

以上是关于UserControl 属性和 WebPartsTemplate,值丢失的主要内容,如果未能解决你的问题,请参考以下文章

具有属性绑定的自定义 UserControl 模板

将 ViewModel 的属性绑定到 UserControl 的子控件和自身的 DependencyProperty

UserControl:如何转换依赖属性并绑定到结果

带有Image属性的WPF UserControl

Silverlight UserControl 自定义属性绑定

如何将 MainWindow 上的自定义属性放入 UserControl(来自 UserControl 库/DLL)?