asp.net MVC ModelState.IsValid返回false

时间:2010-05-21 16:02:04

标签: asp.net asp.net-mvc modelstate

我正在使用ASP.NET MVC应用程序。我有一个视图模型如下:

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

从UI Perspective用户可以输入日期为mmddyyyy。当用户以这种格式输入时说 01012001,我在控制器中的ModelState.IsValid代码片返回false。当我在ModelState中快速观察时,我看到了“SampleDate”的错误,说“值01012001对SampleDate无效”。

在我的模型绑定器中,在OnModelUpdated事件期间,我尝试将值01012001格式化为01/01/2001并将其分配回SampleInterestViewModel.SampleDate,以为ModelState.IsValid可能返回true而没有该错误。但是仍然是ModelState.IsValid是假的,当我查看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值。

任何想法或评论。

2 个答案:

答案 0 :(得分:4)

尝试使用

在您的操作中使用要绑定的参数的白名单
Bind(Include="param1,param2...")

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

答案 1 :(得分:4)

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

  1. 在模型活页夹中修复格式后,您可以使用ModelState["SampleDate"].Errors.Clear();清除ModelState错误。
  2. 使用JavaScript验证输入以强制用户输入正确的格式。
  3. 使用JavaScript在表单发布之前更改用户的格式。
  4. 我认为1和2的组合是你最好的选择。

相关问题