3

約 44 のコントロールを持つ長い asp.net Web フォームを作成しました。そして、このデータはDBに保存されます。私の問題は、フォームの送信後、ViewState 内のすべてのデータをクリアしたいので、Web フォーム コントロールのコンテンツをクリアする必要があることです。各コントロールを手動で (そして面倒に) クリアせずに、どうすれば可能ですか?

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

申し訳ありませんが、私の評判が低いため、Omkar Hendre の回答にコメントを追加できません。コードは適切で、私の問題では、Form.Controls の前に Page を配置する必要があります。

ClearFields(Page.Form.Controls);

ところで、どうもありがとうございました!:)

于 2015-03-05T07:43:21.863 に答える
0

ViewState をいじらないことをお勧めします。コントロールの状態を適切に一致させるためのものです。

代わりに、リダイレクトするか、コントロールを明示的にクリアして、コントロールの状態を変更してください。

于 2012-12-14T21:14:42.383 に答える