绑定我有一个控制器动作,其定义看起来喜欢 -默认模型绑定不适用于可空类型的IEnumerable
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
}
的“名称”属性获取在控制器动作中填充,但是SourceId属性保留为空。 destinationId这是一个长?参数也被填充。
在逐步完成MVC(版本2)源代码时,这是DefaultModelBinder抛出的异常。
从类型 'System.Int32' 到类型 参数转换 'System.Nullable`1 [[System.Int64,mscorlib程序,版本= 2.0.0.0,文化=中性公钥= 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源代码已经过优化,因此我无法遍历大部分代码。更新
:请求被发送是HTTP POST使用JSON与源JSON外形酷似 -
{"info":[{"Name":"CL1","SourceId":2}], "destinationId":"1"}
我不知道,如果类型转换器需要被放入,作为动作中的其他输入参数是长? (destinationId),这似乎是填充罚款。 – QED 2011-05-02 17:26:24
@QED:是的,我意识到这个问题 - 这个问题似乎是特定于IEnumerable <>'绑定。不过,这就是我想要的;我假设默认的模型联编程序显式地完成了简单整型类型和它们的可空对象之间的所有转换,但是对集合并没有这样做。是的,这意味着另一种可能的解决方案是覆盖默认模型绑定器... – rsenna 2011-05-02 17:36:13