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

本文关键字:绑定 中的 Nullable IEnumerable 类型 模型 默认 | 更新日期: 2023-09-27 17:54:46

我有一个控制器动作,它的定义看起来像-

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属性仍然为空。destinationId是一个长?参数也被填充。

在逐步执行MVC(版本2)源代码时,这是DefaultModelBinder抛出的异常。

从类型'System '转换的参数。输入Int32'"System.Nullable"1[[系统。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"}

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

也许太晚了,但我已经找到了一个解决办法。您可以在发送数据之前将SourceId字段转换为字符串。JSON数据看起来像

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

这在我的情况下工作(Int32 -> decimal?, asp.net MVC 3)

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

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

填充模型

默认模型绑定器将所有SourceId值解析为整型。但似乎。net缺少从intlong?的默认类型转换。

我要做的是为这种情况实现一个类型转换器