3

我编写了一个冗长的 asp.net 网络表单,其中包含大约 44 个控件。这些数据被保存到数据库中。我的问题是,表单提交后,我想清除 ViewState 中的所有数据,并且应该清除 webform 控件的内容。如果不手动(并且繁琐地)清除每个控件,怎么可能?

ViewState.Clear()不工作 Page.EnableViewState = false不工作。

4

5 回答 5

3

如果您停留在同一页面上,则在客户端或从回发的代码隐藏中清除它会比重定向稍微好一些,因为您正在节省到服务器的行程,尽管这需要更多的工作。

此外,Response.Redirect(url)抛出一个ThreadAbortionException,这对性能有负面影响,所以如果你想去重定向路线,考虑Response.Redirect(url, false).

客户端选项:(简单的方法)

<script>
        $(':input').each(function () {
            switch (this.type) {
                case 'password':
                case 'text':
                case 'select-multiple':
                case 'select-one':
                case 'textarea':
                    $(this).val('');
                    break;
                case 'checkbox':
                case 'radio':
                    this.checked = false;
                    break;
            }
        });
</script>

这篇文章中窃取的代码。

服务器端选项:

您可以遍历所有控件以清除它们。在处理表单的函数末尾,添加:

ClearForm(Page.Form.Controls);

功能:

 public void ClearForm(ControlCollection controls)
    {
        foreach (Control c in controls)
        {
            if (c.GetType() == typeof(System.Web.UI.WebControls.TextBox))
            {
                System.Web.UI.WebControls.TextBox t = (System.Web.UI.WebControls.TextBox)c;
                t.Text = String.Empty;
            }
            //... test for other controls in your forms DDL, checkboxes, etc.

            if (c.Controls.Count > 0) ClearForm(c.Controls);
        }
    }

循环通过控件和子控件经常出现,因此您可以编写一个扩展方法来执行此操作。类似于我在这篇文章中所做的事情(而是一个返回所有控件集合的函数)。我的项目中有一个扩展方法,称为 GetAllChildren(),因此上面的相同代码将像这样执行:

foreach (Control i in Page.Form.GetAllChildren())
{   
     if (i.GetType() == typeof(System.Web.UI.WebControls.TextBox))
     {
          System.Web.UI.WebControls.TextBox t = (System.Web.UI.WebControls.TextBox)i;
          t.Text = String.Empty;
     }
     // check other types
}
于 2012-12-14T16:18:43.130 回答
3

插入完成后,只需使用Response.Redirect从头重新加载相同的页面。

例如Page.Response.Redirect(Page.Request.RawUrl)

于 2012-12-14T07:09:28.307 回答
1

尝试这个

   public static void ClearFields(ControlCollection pageControls)
    {
        foreach (Control contl in pageControls)
        {
            string strCntName = (contl.GetType()).Name;

            switch (strCntName)
            {
                case "TextBox":
                    TextBox tbSource = (TextBox)contl;
                    tbSource.Text = "";
                    break;
                case "RadioButtonList":
                    RadioButtonList rblSource = (RadioButtonList)contl;
                    rblSource.SelectedIndex = -1;
                    break;
                case "DropDownList":
                    DropDownList ddlSource = (DropDownList)contl;
                    ddlSource.SelectedIndex = -1;
                    break;
                case "ListBox":
                    ListBox lbsource = (ListBox)contl;
                    lbsource.SelectedIndex = -1;
                    break;
            }
            ClearFields(contl.Controls);
        }
    }
    protected void btn_cancel_Click(object sender, EventArgs e)
    {
        ClearFields(Form.Controls);
    }
于 2014-08-06T09:16:59.187 回答
1

抱歉,由于我的声誉低下,我无法为 Omkar Hendre 的回答添加评论。代码很好,对于我的问题,我需要将 Page 放在 Form.Controls 之前。

ClearFields(Page.Form.Controls);

顺便说一句,非常感谢你!:)

于 2015-03-05T07:43:21.863 回答
0

我建议你不要玩 ViewState。它旨在正确匹配控件的状态。

相反,只需通过重定向或显式清除控件来更改控件的状态。

于 2012-12-14T21:14:42.383 回答