2011-06-16 29 views
0

美好的一天!防止保存在ModelState中的值

ASP.NET MVC通過在ModelState內的GET/POST週期內存儲輸入值,並在出現驗證錯誤時自動將它們輸入到輸入中,從而做得很好。

但在我的表單中,我有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(字符串屬性名)加一點語法糖到這裏面會做SetModelValue爲你,並應使代碼更清潔一點。 – Chao 2011-06-17 15:34:38

+0

但是如何使它適用於任何類型的字段(值類型和引用類型),而不僅僅是字符串? – artvolk 2011-06-18 08:24:28

+0

嗯不太確定,你可能需要在模型綁定器中進行挖掘,試圖找出這個類型,然後通過反射來實例化它。 – Chao 2011-06-21 15:50:37

1

您可以使用動作參數綁定屬性來控制模型綁定行爲:

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

看來你讓我錯了,我需要綁定域(以便在控制器中訪問它),但是我不需要在窗體重新顯示的情況下重新填充它(當發生驗證錯誤時)。 – artvolk 2011-06-16 12:49:35

+0

嗯,好的,在這種情況下,我想它需要是醜陋的SetModelValue – 2011-06-16 13:40:30