2011-06-16 2 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 (строку ИмениСвойство), который будет делать SetModelValue для вас и должен сделать код немного чище. – Chao

+0

Но как заставить его работать с любым типом поля (как для типов значений, так и для ссылочных типов), а не только для строки? – artvolk

+0

Хммм не так уверен, вам, возможно, придется копаться в модельных машинах, чтобы попытаться выработать тип, а затем создать его через отражение. – Chao

1

Вы можете использовать атрибут привязки от параметра действия для управления моделью связывания поведения:

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

Кажется, вы ошиблись, мне нужно, чтобы поле было привязано (чтобы получить доступ к нему в контроллере), но мне не нужно его перезаписывать в случае повторного отображения формы (при возникновении ошибок проверки). – artvolk

+0

Ах, хорошо, и в этом случае я думаю, это должно быть уродливое SetModelValue –

Смежные вопросы