ASP.NET MVC3 RC2从请求参数绑定到方法参数的bug

时间:2012-03-01 12:58:30

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

在将值发布到控制器方法时遇到错误,其中一个参数是可为空的int。 重现的步骤:

我已经创建了一个测试方法

[HttpPost]
public ActionResult PostTest(string from, int? number, bool? formsearch)
{
return new ContentResult { Content = string.Format("{0}/{1}/{2}", from, number, formsearch) };
}

使用jquery,我创建了一个Post请求

$.post("http://localhost/mysite/test/posttest",{ from:"1//1/2009",number:"156",formsearch:true});

请求(例如,在fiddler中)清楚地显示了正在发送的值:

自:1 //二千○九分之一 数量:156 formsearch:true

但是从这个函数返回的结果是:

1 // 1/2009 //真

如果我改变int? number到int number,结果是正确的:

1 // 1/2009/156 /真

在MVC3 RC1中,这对nullable int

没有任何问题

更新:我似乎没有新创建的MVC3网站的问题。我的项目中有什么能影响模型绑定到可空int的?为什么RC1和RC2之间会有区别?有人建议调试这个模型绑定问题吗?

1 个答案:

答案 0 :(得分:2)

这是MVC 3 RC2版本中的已知错误。 ScottGu said:

  

我们已经看到一些元数据缓存错误的报告,这些错误在至少两种情况下表现出来:

     
      
  • 操作方法中的可空参数存在问题:如果控制器操作方法具有可为空的参数(如int? - 或具有可为空的子属性的复杂类型),则可以为null的参数可能总是为空 - 即使请求包含参数的有效值。
  •   

我链接的博客文章包含一个解决方法:在Application_Start添加一行:

// Workaround to fix RC2 bug with Metadata caching
ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();

但实际上你应该更新到RTM。如果RC2的上线许可证在RTM版本之后幸存下来,我会感到非常惊讶。