【问题标题】:MVC ModelState erroneously reports errorsMVC ModelState 错误地报告错误
【发布时间】:2012-10-29 08:54:21
【问题描述】:

我正在接收来自视图的模型。
有些值会自动填写。

但是,一些必需的值需要手动添加,如下所示:

[HttpPost]
public ActionResult Foobar(FooModel model, FormCollection collection)
{
    // "timePicker" is a dropdown list containing different times
    var time = collection["timePicker"].Split(':');
    model.Hours = int.Parse(time[0]);
    model.Minutes = int.Parse(time[1]);

    if (ModelState.IsValid)
    {
        ... // Do stuff
    }
}

那么问题来了:

ModelState.IsValid 为假。
我调试了它,它声称 model.Minutesmodel.Hours 没有分配给。
...这不是真的,因为我刚刚为它们分配了值

我考虑使用ModelState.Clear(),但我不想手动检查其余所有信息是否有效。

还有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: asp.net-mvc validation modelstate


    【解决方案1】:

    好吧,模型绑定,在ModelState 中输入错误,在进入你的操作之前已经完成了。

    所以 MinutesHours 错误在您添加小时和分钟值之前在 ModelState 中(这使其无效)。

    您可以通过以下方式删除这些错误(而不是所有错误,如 Clear() 所做的那样):

    ModelState.Remove("Hours");
    ModelState.Remove("Minutes");
    

    解决此问题的另一种方法是创建(和使用)自定义 ModelBinder。

    【讨论】:

    • +1,但我不记得如果密钥不存在是否会引发异常。可能不会:)
    • @mattytommo 好吧,在这种情况下,密钥应该始终存在。顺便说一句,如果键不能被删除(只读字典或不存在的键),该方法只返回 false,如果键已被删除,则返回 true。
    • @JacobSpire 顺便说一句,在这种情况下,您也可以使用 ViewModel int,它可能会更好(或者,如前所述,自定义 ModelBinder)。
    • @RaphaëlAlthaus 您仍然需要在自定义模型绑定器中删除无效模型状态,对吧?
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2011-03-09
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多