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);
        });
    });