2011-06-16 1 views
0

おはよう!ModelStateで値を保持しないようにする

ASP.NET MVCは、GET/POSTサイクル中に入力の値をModelStateに格納し、検証エラーの場合に自動的に入力に入れておくのが適切です。

私のフォームには、検証エラー(CAPTCHA値は各リクエストで再生成されます)中に保存すべきではないCAPTCHAフィールドがあります。

私は

if (TryUpdateModel(model)) 
{ 
    // ... 
} 
else 
{ 
    ModelState.Remove("CaptchaValue"); // ModelState does have CaptchaValue 
    return View(model); // CaptchaValue is empty in model 
} 

を設定することによって、これを達成しようとした。しかし、それは動作しません。

ModelStateで保持されないようにするために、モデルフィールドに適用できる属性がありますか?

ありがとうございます!

答えて

0

私は近くのスレッドMVC - How to change the value of a textbox in a post?でこれを見つけた:

ModelState.SetModelValue("CaptchaValue", new ValueProviderResult(String.Empty, String.Empty, System.Threading.Thread.CurrentThread.CurrentCulture)); 

しかし、少し醜いと思われます。

あなたがモデル結合挙動を制御するためのアクションパラメータにバインド属性を使用することができます
+1

あなたはどうなる拡張メソッドModelState.ClearValue(文字列PropertyName意味)を行うことにより、これに少し糖衣構文を追加することができますあなたのためのSetModelValueとコードを少しきれいにする必要があります。 – Chao

+0

しかし、文字列だけでなく、どのタイプのフィールド(値型と参照型の両方)でも動作させるにはどうすればいいですか? – artvolk

+0

あまり確かではありませんが、モデルバインダーを掘り下げてタイプを試してからリフレクションでインスタンス化する必要があります。 – Chao

1

public ActionResult YourActionName([Bind(Exclude = "CaptchaValue")]ModelType model) 
+0

私は間違っているようですが、バインドするにはフィールドが必要です(コントローラでアクセスできるようにするため)が必要ですが、フォームの再表示(検証エラーが発生した場合)に再投入する必要はありません。 – artvolk

+0

ああ、そうですね、醜いSetModelValueにする必要があると思います –

関連する問題