我编写了一个冗长的 asp.net 网络表单,其中包含大约 44 个控件。这些数据被保存到数据库中。我的问题是,表单提交后,我想清除 ViewState 中的所有数据,并且应该清除 webform 控件的内容。如果不手动(并且繁琐地)清除每个控件,怎么可能?
ViewState.Clear()
不工作
Page.EnableViewState = false
不工作。
如果您停留在同一页面上,则在客户端或从回发的代码隐藏中清除它会比重定向稍微好一些,因为您正在节省到服务器的行程,尽管这需要更多的工作。
此外,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
}
插入完成后,只需使用Response.Redirect
从头重新加载相同的页面。
例如Page.Response.Redirect(Page.Request.RawUrl)
尝试这个
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);
}
抱歉,由于我的声誉低下,我无法为 Omkar Hendre 的回答添加评论。代码很好,对于我的问题,我需要将 Page 放在 Form.Controls 之前。
ClearFields(Page.Form.Controls);
顺便说一句,非常感谢你!:)
我建议你不要玩 ViewState。它旨在正确匹配控件的状态。
相反,只需通过重定向或显式清除控件来更改控件的状态。