JSON作为null传递给方法参数

时间:2014-09-23 09:25:47

标签: c# javascript ajax json knockout.js

我终于试着尝试使用KnockoutJS。我探索了在MVC 4中将JSON数据发送到C#方法的更短方法,但最终使用了AJAX方法。我对以下内容感到困惑,并希望有人可以提供帮助。

的Javascript

var VM = function () {
    var self = this;
    self.ValidateAndCreate = function () {
        console.log("entered");
        var a = {
            b: "1",
            c: "2",
            d: {
                e: "3"
            }
        };
        var input = { data: a }
        console.log(JSON.stringify(input));
        $.ajax({
            url: '/McAfee/ValidateAndCreatePartner',
            data: JSON.stringify(input),
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function (result) {
                console.log('success');
            }
        });
    }
}
var viewModel = new VM();
ko.applyBindings(viewModel);

C#

    [HttpPost]
    public void ValidateAndCreatePartner(string data)
    {
        var x = JsonConvert.DeserializeObject(data);
        RedirectIfSuccess();
    }

目前发生的情况是ValidateAndCreatePartner触发,但参数data为空,然后NewtonSoft.Json.JsonConvert.DeserializeObject因此失败。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

由于您的内容类型为application/json,因此视图函数的参数将自动反序列化(它不再是字符串)。

在服务器端创建一个与您发送的视图模型匹配的视图模型,并将其用作视图的类型参数:

public class D {
    public string e {get;set;}
}

public class A {
    public string b {get;set;}
    public string c {get;set;}
    public D d {get;set;}
}   


[HttpPost]
public void ValidateAndCreatePartner(A data)
{
    // no need to deserialize data
    RedirectIfSuccess();
}

答案 1 :(得分:1)

MVC中最简单的方法是根据您的数据创建类:它更清晰!例如,您的示例可以尝试:

[HttpPost]
public ActionResult Test(TestClass data) {
    RedirectIfSuccess();
}


public class TestClass
{
    public string b { get; set; }
    public string c { get; set; }
    public TestSubClass d { get; set; }
}

public class TestSubClass
{
    public int e { get; set; }
}