ModelBinding not deserializing json

梦想与她 提交于 2019-12-11 09:15:10

问题


I'm using MVC 5, Web API 2 with Entity Framework 6 in vs 2012.

I'm able to successfully call the right action in my web api controller but the incoming json is never deserialized, or at least not properly. The modelBinding recognizes that the json in the request matches the argument Type for the Post action but every property is null or default value.

Why is the json not being deserialized? I can't see any issues here.

This not an active url, just something setup on my local

POST http://www.scabs.com/api/scabs

Body:

{
    "scab" : {
        "url" : "http://money.cnn.com/2013/12/18/news/companies/target-credit-card/index.html?iid=Lead",
        "title" : "Target: 40 million credit cards compromised",
        "description" : "The Secret Service is investigating a reported credit card data breach at discount retailer Target.",
        "image" : {
            "height" : 367,
            "width" : 620,
            "url" : "http://i2.cdn.turner.com/money/dam/assets/131128213407-black-friday-target-pa-620xa.jpg"
        },
        "category" : null
    }
}

Request header:

Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:422
Content-Type:application/json
Cookie:.ASPXAUTH=DA97AB5D720AC3100F9698DEAED044403CC5BA266EA8F3361E72C183DA2FAD5EB76D0D9DC2AB6DE30507FF788B7D6607473F87B6EE0D28C043DA50508407ABA1FC7ADA9B8A61F2A7C95024869064EE5D9C6863C670FEF221F9447A3D1F2E7CA67849A33B45B0776FFF0D76CD5C290500
Host:www.scabs.com
Origin:chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36

Controller:

public class ScabsController : ApiController {

    private ScabStore _store;

    private ScabStore store {
        get { return _store = _store ?? new ScabStore(); }
    }

    // POST api/scabs
    public void Post(Scab scab) {
        store.scabRepository.save(scab);
        store.commit();
    }
}

Scab Type

public class Scab {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }

    [DataType(DataType.Url)]
    public string url { get; set; }
    public string title { get; set; }
    public string description { get; set; }
    public string site { get; set; }
    public virtual Category category { get; set; }
    public virtual Image image { get; set; } // Complex Type
    public virtual User postedBy { get; set; }
    public virtual ICollection<Score> scores { get; set; }
    public virtual ICollection<Comment> comments { get; set; }

    public Scab() {
        scores = new List<Score>();
        comments = new List<Comment>();
    }
}

I should also note that the Image property is a ComplexType


回答1:


Your JSON data does not match your C# model.

So you need to drop the unnecessary "scab" property and your data should look like this:

{
    "url" : "http://money.cnn.com/2013/12/18/news/companies/target-credit-card/index.html?iid=Lead",
    "title" : "Target: 40 million credit cards compromised",
    "description" : "The Secret Service is investigating a reported credit card data breach at discount retailer Target.",
    "image" : {
        "height" : 367,
        "width" : 620,
        "url" : "http://i2.cdn.turner.com/money/dam/assets/131128213407-black-friday-target-pa-620xa.jpg"
    },
    "category" : null
}

Or if you cannot change the client side modify your C# action code to:

public void Post(SaveScabModel scabModel) {
    store.scabRepository.save(scabModel);
    store.commit();
}

Where SaveScabModel just wraps the Scab model to have the "extra" scab also on the c# side:

public class SaveScabModel {
    public Scab Scab { get; set; }
}


来源:https://stackoverflow.com/questions/20750971/modelbinding-not-deserializing-json

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!