【问题标题】:Can not get the ASP MVC4 APIController Post Method to read JSON无法获取 ASP MVC4 APIController Post 方法来读取 JSON
【发布时间】:2012-11-19 15:15:22
【问题描述】:

我在我的 MVC 4 项目中将我的 JSON 数据发布回我的 api 控制器时遇到问题。 这是我的javascript:

 self.saveInvestment = function () {
        var investmentdata = ko.mapping.toJSON( { "InvestmentSummary": self.InvestmentSummary } );

        $.ajax({
            url: "../api/investment/",
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: investmentdata,
            success: function () {
                alert('hi');
            }
        });

    };

这是我的控制器代码:

[HttpPost]
        public void Post([FromBody]InvestmentSummary val)
        {
            string blah;
            if (val.InvestmentDetails[0] != null)
                blah = val.InvestmentDetails[0].Cost.ToString();

        }

这是来自 fiddler 的标题信​​息:

application/json; charset=UTF-8
http://localhost:1961
http://localhost:1961/Investment
X-Requested-With: XMLHttpRequest

POST http://localhost:1961/api/investment/ HTTP/1.1
Host: localhost:1961
Connection: keep-alive
Content-Length: 2470
Origin: http://localhost:1961
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Content-Type: application/json; charset=UTF-8
Accept: */*
Referer: http://localhost:1961/Investment
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

{"InvestmentSummary":{"InvestmentDetails":[{"Cost":"11","FairValue":0,"Tranches":[{"IDTranche":null.......

JSON 格式正确,我用 JSON Lint 仔细检查了一遍。 当我在我的控制器中调试我的应用程序时,“val”中没有数据。 我究竟做错了什么?? 谢谢!

编辑: 这是我对 InvestmentSummary 的类定义:

    public class InvestmentSummary : TransactionSummary
    {
        public InvestmentSummary()
        {
            this.InvestmentDetails = new List<InvestmentDetail>();
        }

        public List<InvestmentDetail> InvestmentDetails { get; set; }
    }

我认为我的问题是我的 JSON 正在使用 InvestmentDetails,但我的类名是 InvestmentDetail?任何人,请帮忙?谢谢

第二次编辑* 我的完整 JSON 具有这样的结构:

var init = {
        InvestmentSummary: {
            InvestmentDetails: [],
            IDTransactionSummary:null,
            TxnParameter: {},
            TxnDate: "",
            Fund: {},
            PortfolioCompany: {}
        }
    };

在 tpeczek 的帮助下,我能够阅读 InvestmentDetails。 但是现在我怎样才能得到我的 JSON 的其余部分呢? 在我的 javascript 中,JSON 是正确构建的,但是,当它到达我的控制器时, 只有 InvestmentDetails 存在。 InvestmentSummary 的所有其他子项都消失了! 谢谢

【问题讨论】:

    标签: asp.net json asp.net-web-api


    【解决方案1】:

    首先,您不应该将对象包装到 JavaScript 中的另一个对象中:

     self.saveInvestment = function () {
            var investmentdata = ko.mapping.toJSON(self.InvestmentSummary);
    
            $.ajax({
                url: "../api/investment/",
                type: 'POST',
                contentType: 'application/json; charset=utf-8',
                data: investmentdata,
                success: function () {
                    alert('hi');
                }
            });
    
        };
    

    此外,在这种情况下您不需要 FromBody

    [HttpPost]
    public void Post(InvestmentSummary val)
    {
        string blah;
        if (val.InvestmentDetails[0] != null)
        blah = val.InvestmentDetails[0].Cost.ToString();    
    }
    

    【讨论】:

    • 感谢您的回复。现在看,我认为我的问题在于JSON的复数。我的 POCO 对象名称是 InvestmentDetail。但我的 JSON 是 InvestmentDetails(这是 InvestmentDetail 列表的名称)。解决此问题的最佳方法是什么?谢谢
    • @user1175857 对于 JSON 反序列化,重要的部分是属性名称和类型兼容性,而不是类型名称。当你尝试我所描述的原因时,你得到了什么结果?
    • 抱歉 tpeczek 响应缓慢。但是您的解决方案完全有效。非常感谢!
    • 嗨@tpeczek 或其他任何人。我刚刚注意到这个解决方案不包括我所有的 JSON。除了 InvestmentDetails,我还有 TxnDate 属性和 Fund 数组。我已经编辑了原始帖子。请帮忙!
    • @user1175857 您需要创建一个与 JSON 格式相对应的对象,请发布您的整个 JSON(集合可能只包含一个元素 - 只需要查看属性),我将尝试提出一个用于反序列化的服务器端对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多