13

绑定我有一个控制器动作,其定义看起来喜欢 -默认模型绑定不适用于可空类型的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"} 

回答

1

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

我会做的是implementing a type converter这种情况。

+0

我不知道,如果类型转换器需要被放入,作为动作中的其他输入参数是长? (destinationId),这似乎是填充罚款。 – QED 2011-05-02 17:26:24

+0

@QED:是的,我意识到这个问题 - 这个问题似乎是特定于IEnumerable <>'绑定。不过,这就是我想要的;我假设默认的模型联编程序显式地完成了简单整型类型和它们的可空对象之间的所有转换,但是对集合并没有这样做。是的,这意味着另一种可能的解决方案是覆盖默认模型绑定器... – rsenna 2011-05-02 17:36:13

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 

填充模型罚款。

+0

它们最初是视图模型中的属性。我已经更新了代码,请注意我正在使用JSon进行发布。 – QED 2011-05-02 19:23:18

+0

@QED,默认情况下,ASP.NET MVC 2中没有用于请求的Json提供程序。它是内置的ASP.NET MVC 3.因此,您正在使用什么来将JSON请求解析到您的模型中? – 2011-05-02 19:40:18

+0

我正在使用MVCFutures中可用的JsonValueProviderFactory。这些值似乎被设置为反序列化,并且也在后台存储中进行设置。 – QED 2011-05-02 20:40:41

4

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

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

这个工作在我的情况(的Int32 - >十进制?ASP NET MVC 3)

+4

不要太晚,男人。感谢您的提示 - 为我工作。 – 2011-12-21 17:43:28

相关问题