C# Usercontrol在回发过程中丢失Viewstate

C# Usercontrol在回发过程中丢失Viewstate,c#,asp.net,viewstate,ascx,C#,Asp.net,Viewstate,Ascx,我有一个用户控件,它使用对象作为内部属性(下面是一些代码) 我在以编程方式设置Step类的属性时遇到了问题,当以编程方式设置时,它会在回发过程中丢失,这表明与Viewstate(?)有关 当以声明方式设置步骤类的属性时,它工作正常 有人知道这段代码是什么/是什么导致它在回发过程中丢失状态吗 ASPX页面 <uc1:StepControl ID="StepControl1" runat="server"> <Step1 Title="1. Select y

我有一个用户控件,它使用对象作为内部属性(下面是一些代码)

我在以编程方式设置Step类的属性时遇到了问题,当以编程方式设置时,它会在回发过程中丢失,这表明与Viewstate(?)有关

当以声明方式设置步骤类的属性时,它工作正常

有人知道这段代码是什么/是什么导致它在回发过程中丢失状态吗

ASPX页面

    <uc1:StepControl ID="StepControl1" runat="server">
        <Step1 Title="1. Select your Products" Enabled="true">
            <Content>

                <div class="clearfix">
                    <div class="floatRight">
                        <asp:Button ID="btnGoToStep2" 
                        runat="server" 
                        Text="Next" 
                        CausesValidation="false" 
                        OnClick="btnGoToStep2_OnClick" />
                    </div>
                </div>

            </Content>
        </Step1>
        <Step2 Title="2. Select your Features">      
            <Content>

                <div class="clearfix">
                    <div class="floatLeft">
                        <asp:Button ID="btnBackToStep1" 
                        runat="server" 
                        Text="Back" 
                        CausesValidation="false" 
                        OnClick="btnBackToStep1_OnClick" />
                    </div>                    
                    <div class="floatRight">
                        <asp:Button ID="btnGoToStep3" 
                        runat="server" 
                        Text="Next" 
                        CausesValidation="false" 
                        OnClick="btnGoToStep3_OnClick" />
                    </div>
                </div>                    

            </Content>
        </Step2>                     
    </uc1:StepControl>
用户控制代码隐藏

    protected void btnGoToStep2_OnClick(object sender, EventArgs e)
    {
        StepControl1.Step1.StatusText = "4 Products Selected";
    }

    protected void btnBackToStep1_OnClick(object sender, EventArgs e)
    {
        // StatusText (of Step1) gets lost at this point. 
    }
public partial class StepControl : System.Web.UI.UserControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [NotifyParentProperty(true)]
    public Step Step1 { get; set; }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [NotifyParentProperty(true)]
    public Step Step2 { get; set; }

    protected void Page_Init(object sender, EventArgs e)
    {
        AddSteps();
    }

    private void AddSteps() { }
}

[Serializable()]
[ParseChildren(true)]
[PersistChildren(false)]
public class Step
{
    [PersistenceMode(PersistenceMode.Attribute)]
    public string Title { get; set; }

    [PersistenceMode(PersistenceMode.Attribute)]
    public string Status { get; set; }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateInstance(TemplateInstance.Single)]
    [TemplateContainer(typeof(StepContentContainer))]
    public ITemplate Content { get; set; }

    public class StepContentContainer : Control, INamingContainer { }
}

这可能与在页面中创建控件的顺序有关。如果在回发之后,控件的创建顺序与第一次加载页面的顺序不同,则检索viewstate将不适用于这些控件


如何以编程方式设置step的属性?

它可能与在页面中创建控件的顺序有关。如果在回发之后,控件的创建顺序与第一次加载页面的顺序不同,则检索viewstate将不适用于这些控件


如何以编程方式设置step的属性?

我认为您设置的字符串永远不会进入ViewState。我这里的术语有点少(阅读:我不知道术语),但我认为您的属性
[PersistenceMode(PersistenceMode.attribute)]
只告诉ASP.NET它应该在标记(ASPX文件)中查找名为“Status”的属性,如果它找到了一个,则将属性
Status
设置为其值(事实上,我想知道在你的例子中它到底放在哪里?)。但它并没有告诉任何人把东西放到ViewState中

如果您要按照以下几行定义您的属性
状态

[PersistenceMode(PersistenceMode.Attribute)]
public string Status
    {
        get
        {
            object o = ViewState["Status"];
            if(o != null) {
                return (string)o;
            }
            return string.Empty;
        }
        set
        {
            ViewState["Status"] = value;
        }
    }
你应该过得更好

对于其余部分,我不确定您是否必须在UserControls中调用
TrackViewState()
,甚至覆盖
SaveViewState
LoadViewState
,但我不这么认为。如果是这种情况,以下链接可能会有所帮助:

  • 微软:
  • ASP.NET论坛:

我认为您设置的字符串永远不会进入ViewState。我这里的术语有点少(阅读:我不知道术语),但我认为您的属性
[PersistenceMode(PersistenceMode.attribute)]
只告诉ASP.NET它应该在标记(ASPX文件)中查找名为“Status”的属性如果它找到了一个,将属性
Status
设置为它的值(实际上我想知道它在您的示例中到底放在哪里?),但它不会告诉任何人将某个内容放入ViewState

如果您要按照以下几行定义您的属性
状态

[PersistenceMode(PersistenceMode.Attribute)]
public string Status
    {
        get
        {
            object o = ViewState["Status"];
            if(o != null) {
                return (string)o;
            }
            return string.Empty;
        }
        set
        {
            ViewState["Status"] = value;
        }
    }
你应该过得更好

对于其余部分,我不确定您是否必须在UserControls中调用
TrackViewState()
,甚至覆盖
SaveViewState
LoadViewState
,但我不这么认为。如果是这种情况,以下链接可能会有所帮助:

  • 微软:
  • ASP.NET论坛:

您的页面中是否使用了任何存在视图状态问题的AJAX或更新面板?@Tj Kellie:Nope-我已经将所有这些都注释掉了,只留下了一部分内容。您的页面中是否使用了存在视图状态问题的AJAX或更新面板?@Tj Kellie:Nope-我已经注释掉了所有这些内容,只留下了一部分内容。@yoannr:我用一些附加代码更新了问题。没有找到解决方案,抱歉!如果您发现任何问题,请随时通知我们。@yoannr:我用一些附加代码更新了问题。没有找到解决方案,抱歉!如果您发现任何情况,请随时通知我们……)