ASP.NET MVC:使用HtmlHelper.TextBox和自定义模型绑定器的空引用异常

问题描述:

我写了一个实现了IModelBinder(见下文)的类。这个类处理的表单有3个输入,每个输入代表日期值(日,月,年)的部分。我还写了一个相应的HtmlHelper扩展方法来打印出表单上的三个字段。ASP.NET MVC:使用HtmlHelper.TextBox和自定义模型绑定器的空引用异常

当给出的日期,月份,年份输入值可以被解析,但是单独的值未通过验证时,一切正常 - 字段被重新填充并且页面按预期向用户提供。

但是,当提供无效值并且无法解析DateTime时,我会返回任意DateTime,以便字段在返回给用户时将重新填充。

我读到了人们曾经遇到的类似问题,他们似乎都是因为缺少致电SetModelValue()。我没有这样做,但即使添加问题后仍未解决。

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    string modelName = bindingContext.ModelName; 
    string monthKey = modelName + ".Month"; 
    string dayKey = modelName + ".Day"; 
    string yearKey = modelName + ".Year"; 

    //get values submitted on form 
    string year = bindingContext.ValueProvider[yearKey].AttemptedValue; 
    string month = bindingContext.ValueProvider[monthKey].AttemptedValue; 
    string day = bindingContext.ValueProvider[dayKey].AttemptedValue; 

    DateTime parsedDate; 
    if (DateTime.TryParse(string.Format(DateFormat, year, month, day), out parsedDate)) 
     return parsedDate; 

    //could not parse date time report error, return current date 
    bindingContext.ModelState.AddModelError(yearKey, ValidationErrorMessages.DateInvalid); 

    //added this after reading similar problems, does not fix! 
    bindingContext.ModelState.SetModelValue(yearKey, bindingContext.ValueProvider[modelName]); 
    return DateTime.Today; 
} 

当我尝试为日期的年份属性创建文本框时,抛出空引用异常,但奇怪地不是日或月!

任何人都可以提供解释,为什么这是?

这应该修复它:

bindingContext.ModelState.AddModelError(
    yearKey, 
    ValidationErrorMessages.DateInvalid 
); 

bindingContext.ModelState.SetModelValue(
    yearKey, 
    bindingContext.ValueProvider[modelName] 
); 

注意,相同的密钥必须使用(yearKey)。

+0

我的错误,认为我复制并粘贴,而我通过编辑代码的一半。我按照你的建议之前,我发布了quesiton – WickyNilliams 2010-06-17 15:23:11

+0

编辑片段,以反映这.. – WickyNilliams 2010-06-17 15:40:47