【问题标题】:Default Model Binder does not bind for Nullable types in IEnumerable默认模型绑定器不绑定 IEnumerable 中的 Nullable 类型
【发布时间】:2011-08-16 23:49:36
【问题描述】:

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

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 是一个 long? 参数,也会被填充。

在单步执行 MVC(版本 2)源代码时,这是 DefaultModelBinder 引发的异常。

从类型'System.Int32'到类型的参数转换 'System.Nullable`1[[System.Int64,mscorlib,版本=2.0.0.0,文化=中性,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"}

【问题讨论】:

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


    【解决方案1】:

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

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

    这适用于我的情况(Int32 -> 十进制?,ASP NET MVC 3)

    【讨论】:

      【解决方案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
      

      很好地填充模型。

      【讨论】:

      • 它们最初是视图模型中的属性。我已经更新了代码,请注意我正在使用 JSon 发布帖子。
      • @QED,默认情况下,ASP.NET MVC 2 中没有请求的 Json 提供程序。它是内置的 ASP.NET MVC 3。所以你用来将 JSON 请求解析为你的型号?
      • 我正在使用 MVCFutures 中提供的 JsonValueProviderFactory。这些值似乎可以反序列化设置,并且也在后备存储中设置。
      【解决方案3】:

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

      对于这种情况,我会做的是implementing a type converter

      【讨论】:

      • 我不确定是否需要放入类型转换器,因为动作中的另一个输入参数很长? (destinationId) 这似乎很好。
      • @QED:是的,我知道 - 问题似乎是特定于 IEnumerable&lt;&gt; 绑定的。不过,这就是我要尝试的;我假设默认模型绑定器显式地在简单整数类型与其可为空的对应物之间进行所有转换,但对集合没有正确执行此操作。是的,这意味着另一种可能的解决方案是覆盖默认模型绑定器......
      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多