我有一个控制器动作,其定义如下:
public ActionResult ChangeModel( IEnumerable<MyModel> info, long? destinationId)
还有模型:
public class MyModel
{
public string Name; //Gets populated by default binder
public long? SourceId; //remains null though the value is set when invoked
}
在控制器动作中,'Name'属性被填充了,但SourceId属性保持为null。destinationId是一个long?类型的参数,也被填充。
通过MVC(版本2)源代码进行调试,DefaultModelBinder抛出了以下异常。
从类型'System.Int32'转换为类型'System.Nullable`1[[System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'失败,因为没有类型转换器可以在这些类型之间进行转换。
如果将模型更改为long而不是long?,则默认模型绑定器会设置该值。
public class MyModel
{
public string Name {get;set;}; //Gets populated by default binder
public long SourceId {get;set;}; //No longer long?, so value gets set
}
这是一个已知问题吗?由于MVC源代码已被优化,我无法逐步执行大部分代码。
更新:发送的请求是使用Json进行的Http POST请求,源JSon类似于 -
{"info":[{"Name":"CL1","SourceId":2}], "destinationId":"1"}