C# 为什么不是';这个嵌套模型是否如我所期望的那样被反序列化?
有一分钟,请忽略这个复杂模型的滑稽之处,并假设你被它困住了:) 因此,我们将给这个动作一个C# 为什么不是';这个嵌套模型是否如我所期望的那样被反序列化?,c#,asp.net-mvc-4,json.net,deserialization,C#,Asp.net Mvc 4,Json.net,Deserialization,有一分钟,请忽略这个复杂模型的滑稽之处,并假设你被它困住了:) 因此,我们将给这个动作一个Foo,而Foo将有一个傻瓜,它包含Bar或另一个Bar。SomeBar包含的内容并不重要。它是一些已知类型的对象,但我们不知道是哪一种……哦,它们不是从一个共同的祖先继承的 好的,当您将json发布到一个执行了Foo的操作时。Foo对象将被反序列化,但愚人主义者为空。如果我创建了一个自定义ModelBinder,请手动读取流并告诉JsonConvert对其进行反序列化一切正常 据我所知,MVC4在封面下使
Foo
,而Foo将有一个傻瓜
,它包含Bar
或另一个Bar
。SomeBar包含的内容并不重要。它是一些已知类型的对象,但我们不知道是哪一种……哦,它们不是从一个共同的祖先继承的
好的,当您将json发布到一个执行了Foo的操作时。Foo对象将被反序列化,但愚人主义者为空。如果我创建了一个自定义ModelBinder,请手动读取流并告诉JsonConvert对其进行反序列化一切正常
据我所知,MVC4在封面下使用JsonConvert。这里有什么区别?为什么内置反序列化不起作用,而我使用JsonConvert显式地起作用
我可能不得不悬赏这个,我计划尽可能多地投入(500?)
顺便说一句,我不是要找工作。我真的只是想知道是什么导致了这种行为
现在来看看代码:
//some sample JSON: {"Foos":{"SomeBar":{"Name":"Insanity"}}}
public ActionResult Test(Foo foo)
{
//Foo.FooList is null
return new EmptyResult();
}
public ActionResult BinderTest([ModelBinder(typeof(FooModelBinder))] Foo foo)
{
//Everything is as it should be
return new EmptyResult();
}
public class FooModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
request.InputStream.Seek(0, SeekOrigin.Begin);
var jsonString = new StreamReader(request.InputStream).ReadToEnd();
Foo foo = JsonConvert.DeserializeObject<Foo>(jsonString);
return foo;
}
}
MVC4中Web API控制器(从
ApiController
继承的类)的默认序列化程序是Json.Net。但是,我相信标准MVC4控制器(从控制器继承的类)的默认序列化程序仍然是JavaScriptSerializer
(出于向后兼容性的原因)。看见因此,这可以很好地解释行为上的差异。您是否检查了ModelState
集合中的简单绑定错误?@asawyer是的,我检查过,那里似乎没有任何错误。我遇到了完全相同的问题。。在这里看到。如果您只是使用JSON转换,它就可以工作。我们最终不得不编写一个代理类,所以我的方法不是这样的<代码>MyActionResultMethod([JsonNet]DTO.MyDTO){
Fun times…@recneps如果你读了我的问题,我会发布使用JsonConvet有效的帖子。我试图找出原因:)很可能归结为帖子数据的样子。启动Fiddler2,看看原始帖子。最有可能的问题是那里的格式不正确。啊,这很有道理!我在这里受到了影响在MVC4上,作为一个整体使用的是Json.net。谢谢!
//some sample JSON: {"Foos":{"SomeBar":{"Name":"Insanity"}}}
public ActionResult Test(Foo foo)
{
//Foo.FooList is null
return new EmptyResult();
}
public ActionResult BinderTest([ModelBinder(typeof(FooModelBinder))] Foo foo)
{
//Everything is as it should be
return new EmptyResult();
}
public class FooModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
request.InputStream.Seek(0, SeekOrigin.Begin);
var jsonString = new StreamReader(request.InputStream).ReadToEnd();
Foo foo = JsonConvert.DeserializeObject<Foo>(jsonString);
return foo;
}
}
$(function () {
$('#button1').click(function () {
var data = '{"Foos":{"SomeBar":{"Name":"Insanity"}}}';
$.post('/home/bindertest', data);
});
$('#button2').click(function () {
var data = '{"Foos":{"SomeBar":{"Name":"Insanity"}}}';
$.post('/home/test', data);
});
});