web-dev-qa-db-ja.com

MVC3はModelStateエラーを削除します

ユーザーがローカルファイルシステムから選択した画像をアップロードする状況があります。私の見解では、フォームには基本的に2つの送信ボタンがあります。 1つは通常のフォーム送信に使用され、すべての検証が実行されます。 2番目は画像のアップロード専用です。この場合、まだ検証したくありません。

「Upload Image」送信ボタンに「style-name cancel」というクラス値を与えることで、クライアント側の検証を無効にすることができました。

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

これで、ポストバックすると、モデルにUploadImageButtonプロパティがあり、このボタンをクリックすると、このプロパティが入力されます(入力の名前がプロパティと一致します)。これにより、フォームが実際の送信ボタンで送信されたか、UploadImageButtonで送信されたかがわかります。

私の質問はこれです... ServerSide検証をオフにするにはどうすればよいですか?ユーザーがこのボタンをクリックしたときに検証概要情報が表示されないようにします。これを使用してカスタムモデルエラーを追加できることを知っています

ModelState.AddModelError("{key}", "{error msg}");

モデルエラーを削除する方法を探しています。これは可能ですか?

編集:

ここに私が思いついたものがあります:

foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) {
     //ModelState.Remove(key); //This was my solution before
     ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak
}
78
Jeff Reddy

次のようなことを行うことで、モデルエラーを削除できます。

if (ModelState.ContainsKey("{key}"))
    ModelState["{key}"].Errors.Clear();
133
bbak

これにより、以前の回答が構築されますが、もう少し簡単になります。

foreach (var modelValue in ModelState.Values)
{
    modelValue.Errors.Clear();
}
62
Dan Friedman

一般に、サーバー側の検証をオフにしたり、ModelStateエラーを手動で削除したりすることは望ましくありません。実行可能ですが、キーとして文字列に依存する必要があるため、エラーが発生しやすくなります。キーを削除する方法についての答えを支持しました。これは正しくて便利なためです。ただし、キーを強く検討する必要があるケースに自分自身を設計することはお勧めしません。

あなたの場合、同じフォームに対して複数の送信ボタンがありますが、実際には画像をアップロードするときにフォームを送信していません。クライアント側の検証を防ぐには、既に示したように「キャンセル」クラスを使用できますが、別のフォームで2番目の送信ボタンを使用することをお勧めします。この場合、メインフォームで検証は行われません。

別のフォームを使用することには2番目の利点があります。画像をアップロードするロジックを処理するだけの別のActionResultメソッドに送信することができます。この異なる方法は、単にモデル状態の「IsValid」プロパティをチェックすることを気にしません。画像に情報があるかどうかだけを気にし、それは個別にチェックできます。 (同じActionResultメソッドを使用する場合でも、モデル状態のIsValidプロパティに依存しないようにロジックを集中させることができます。)

モデルの状態からエラーをクリアする必要があり、すべてをクリアすることが理にかなっている場合は、これを試してください:

foreach (var key in ModelState.Keys)
{
    ModelState[key].Errors.Clear();
}

これにより、キー名を正しく取得することに依存しなくなりますが、値が有効または無効である場合はモデルに値が保持されます。

これらの場合に確認する最後の1つは、ビューにあるのがクライアント側の検証を引き起こさない(ビューにはない)値を持っているが、サーバー側の検証の問題が発生するかどうかです。この場合、@ Html.HiddenFor(model => model.PropertyNameを使用することをお勧めします。可能な場合は、値が既に設定されていると仮定すると、このビューには表示されません。

6
James

私は時々それを使うので、それから拡張メソッドを作りました:

public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName)
{
    if (m.ContainsKey(fieldName))
        m[fieldName].Errors.Clear();
    return m;
}

複数のフィールドのエラーをクリアするために流Itに使用できます。

6
Mahmoodvcs

modelState.Remove( "{key}")を使用してmodelからエラーを削除すると、ModelState.IsValidがtrueにリセットされます。

ModelState.Remove("{key}");
0
Ibrar