【问题标题】:asp.net MVC ModelState.IsValid returning falseasp.net MVC ModelState.IsValid 返回 false
【发布时间】:2011-02-22 10:35:21
【问题描述】:

我正在使用 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 为真,以便我的控制器代码的其余部分可以按预期工作。在 UI 中,我正在执行 AjaxSubmit 以发布 sampleDate 值。

任何想法或想法。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      尝试在您的操作中使用要绑定的参数白名单,使用

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

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

      【讨论】:

      • 一个很好的答案。但我仍然会按照@Bradley 的方式继续前进。但是从你的回答中我学到了一些新东西。
      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 2013-09-08
      • 2019-09-11
      • 2012-11-02
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      相关资源
      最近更新 更多