asp.net MVC ModelState.IsValid返回false

问题描述:

我正在ASP.NET MVC应用程序中工作。我有一个视图模型如下:asp.net MVC ModelState.IsValid返回false

public class SampleInterestViewModel 
{ 
    //Properties defined 
    //One such property that shows an error in ModelState is as follows 
    public DateTime? SampleDate { get; set; } 
} 

从UI角度用户可以输入日期为mmddyyyy。当用户输入 01012001这样的格式时,控制器中的我的ModelState.IsValid代码片段返回false。当我在ModelState中快速观察时,发现Propery“SampleDate”的错误,并说“值01012001对SampleDate无效”。

在我的模型绑定器中,在OnModelUpdated事件期间,我尝试将值01012001设置为01/01/2001,并将其指派回SampleInterestViewModel.SampleDate,认为ModelState.IsValid可能会返回true,而不会出现该错误。但是仍然ModelState.IsValid是false,当我查看ModelState字典时,这个特定的属性在它的集合中仍然存在这样的错误。

最后,我试图格式化01012001并将值01/01/2001直接更新到ModelState字典中的Property SampleDate。但是仍然ModelState.IsValid为false,显示SampleDate属性的相同错误。无法弄清楚为什么ModelState.IsValid的工作原理以及它被设置为false的方式和时间。

如果用户在UI中输入01012001,我仍然需要在modelbinder中将其格式设置为01/01/2001,并确保ModelState.IsValid为true,以便我的控制器代码的其余部分可以按预期工作。在UI中,我正在做一个AjaxSubmit来发布sampleDate值。

任何想法或意见。

我可以看到一些解决方案:

  1. 模型中的粘结剂固定格式后,您可以用ModelState["SampleDate"].Errors.Clear();清除的ModelState错误。
  2. 使用JavaScript验证输入以强制用户输入正确的格式。
  3. 使用JavaScript在表单发布之前更改用户的格式。

我认为1和2的组合是你最好的选择。

尝试用你的行动参数白名单绑定,与

Bind(Include="param1,param2...") 

而在该列表中,ommit您自己绑定参数。阅读this ScottGu的帖子了解更多信息。

+0

非常好的答案。但是我仍然会按照@布拉德利的方式继续前进。但从你的回答中我学到了一些新东西。 – SARAVAN 2010-05-21 17:17:52