2012-10-29 116 views
0

我从视图中接收模型。
一些值会自动填入MVC ModelState错误地报告错误

然而,一些必需的值需要手动添加,就像这样:所以在这里

[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(),但我不想手动检查所有其他信息是否有效。

有没有其他方法可以解决问题?

回答

3

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

因此MinutesHours错误是在ModelState中,然后在小时和分钟中添加值(使其无效)。

你可能只是删除这些错误(而不是所有的错误,如Clear()一样),这样做:

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

另一种方式来解决,这将是创建(和使用)的自定义ModelBinder的。

+0

+1,但我不记得如果密钥不存在是否会引发异常。大概没有:) – mattytommo

+0

@mattytommo好,在这种情况下,关键应该始终存在。顺便说一下,如果不能删除键(只读字典或不存在的键),则该方法返回false,如果键已被删除,则该方法返回true。 –

+0

@JacobSpire顺便说一下,你也可以在这种情况下使用ViewModel,它可能会更好(或者,如上所述,自定义ModelBinder)。 –