默认模型Binder不绑定IEnumerable中的Nullable类型

时间:2011-05-02 13:21:17

标签: c# asp.net-mvc asp.net-mvc-2 model-binding defaultmodelbinder

我有一个控制器动作,其定义如下 -

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"}

3 个答案:

答案 0 :(得分:4)

也许为时已晚,但我找到了解决方法。您可以在发送数据之前将SourceId字段转换为字符串。所以你的JSON数据看起来像

{"info":[{"Name":"CL1","SourceId":"2"}], "destinationId":"1"}

这适用于我的情况(Int32 - &gt; decimal?,ASP NET MVC 3)

答案 1 :(得分:2)

我建议您在视图模型上使用属性而不是字段:

public class MyModel
{
    public string Name { get; set; }
    public long? SourceId { get; set; }
}

现在提出以下要求:

/somecontroller/changemodel?destinationId=123&info[0].Name=name1&info[0].SourceId=1&info[1].Name=name2&info[1].SourceId=2

将模型填充正确。

答案 2 :(得分:1)

Default Model Binder将所有SourceId值解析为int。但似乎.NET缺少从intlong?的默认类型转换器。

对于那种情况,我要做的是implementing a type converter