【问题标题】:ASP .NET Wizard Control and View StateASP .NET 向导控件和视图状态
【发布时间】:2013-07-16 18:41:46
【问题描述】:

我有一个包含 3 个向导步骤的表单,当我单击按钮以动态添加文本框时,效果很好,但是当我进入下一步并单击添加以添加更多文本框时,它会自动添加前面步骤中的所有文本框,然后继续添加,如果我继续点击它。

如何防止这种情况发生。

私有列表 ControlsList { 得到 { if (ViewState["controls"] == null) { ViewState["controls"] = new List(); } 返回(列表)视图状态[“控件”]; } }

private int NextID
{
    get
    {
        return ControlsList.Count + 1;
    }
}


protected override void LoadViewState(object savedState)
{

    string section = Wizard1.ActiveStep.ID;
    int sectionNum = Wizard1.ActiveStepIndex;

    var control = Wizard1.ActiveStep.FindControl("Place" + sectionNum) as PlaceHolder;

    base.LoadViewState(savedState);

    int count = 0;
    foreach (string txtID in ControlsList)
    {
        if (count == 0)
        {
            control.Controls.Add(new LiteralControl("<tr>"));
        }
        TextBox txt = new TextBox();
        control.Controls.Add(new LiteralControl("<td>"));
        txt.ID = txtID;
        control.Controls.Add(txt);
        control.Controls.Add(new LiteralControl("</td>"));

        count = count + 1;
        if (count == 3)
        {
            control.Controls.Add(new LiteralControl("</tr>"));
            count = 0;
        }

    }
}


protected void AddControlButton_Click(object sender, EventArgs e)
{


    string section = Wizard1.ActiveStep.ID;
    int sectionNum = Wizard1.ActiveStepIndex;

    var control = Wizard1.ActiveStep.FindControl("Place" + sectionNum) as PlaceHolder;

    TextBox txt1 = new TextBox();
    TextBox txt2 = new TextBox();
    TextBox txt3 = new TextBox();


    txt1.ID = section.ToString() + "Size" + NextID.ToString();
    control.Controls.Add(new LiteralControl("<td>"));
    control.Controls.Add(txt1);
    control.Controls.Add(new LiteralControl("</td>"));
    ControlsList.Add(txt1.ID);

    txt2.ID = section.ToString() + "Description" + NextID.ToString();
    control.Controls.Add(new LiteralControl("<td>"));
    control.Controls.Add(txt2);
    control.Controls.Add(new LiteralControl("</td>"));
    ControlsList.Add(txt2.ID);

    txt3.ID = section.ToString() + "Quantity" + NextID.ToString();
    control.Controls.Add(new LiteralControl("<td>"));
    control.Controls.Add(txt3);
    control.Controls.Add(new LiteralControl("</td></tr>"));
    ControlsList.Add(txt3.ID);

}

【问题讨论】:

    标签: asp.net controls viewstate wizard


    【解决方案1】:

    您将所有动态文本框存储在 ViewState 中,然后 ControlsList 属性获取器在构建文本框时返回整个列表。

    我的建议是使用Session 缓存而不是ViewState,因为它可以让您将文本框控件与每个向导步骤区分开来,如下所示:

    Session["WizardStep1"] = listOfTextBoxesFromStep1;
    Session["WizardStep2"] = listOfTextBoxesFromStep2;
    Session["WizardStep3"] = listOfTextBoxesFromStep3;
    

    【讨论】:

    • 好主意,感谢您的回复。我以前从未使用过会话,您认为您可以帮助我并告诉我我需要修改代码中的哪些位置才能使用会话。
    • 您是将这些动态创建的文本框存储到磁盘/数据库中,还是每次运行向导时都是全新的体验?
    • 每次运行向导都是一种全新的体验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多