約 44 のコントロールを持つ長い asp.net Web フォームを作成しました。そして、このデータはDBに保存されます。私の問題は、フォームの送信後、ViewState 内のすべてのデータをクリアしたいので、Web フォーム コントロールのコンテンツをクリアする必要があることです。各コントロールを手動で (そして面倒に) クリアせずに、どうすれば可能ですか?
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)
申し訳ありませんが、私の評判が低いため、Omkar Hendre の回答にコメントを追加できません。コードは適切で、私の問題では、Form.Controls の前に Page を配置する必要があります。
ClearFields(Page.Form.Controls);
ところで、どうもありがとうございました!:)
ViewState をいじらないことをお勧めします。コントロールの状態を適切に一致させるためのものです。
代わりに、リダイレクトするか、コントロールを明示的にクリアして、コントロールの状態を変更してください。