【问题标题】:JSON passing as a null to a method argumentJSON 作为 null 传递给方法参数
【发布时间】:2014-11-17 10:41:40
【问题描述】:

我终于尝试使用 KnockoutJS。我探索了将 JSON 数据发送到 MVC 4 中的 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 结果失败。我该如何解决这个问题?

【问题讨论】:

  • 我已经一年多没有用 JSON 做任何事情了,我也无法访问我的旧源代码 - 我觉得我缺少一些基本的东西

标签: c# javascript ajax json knockout.js


【解决方案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; }
}

【讨论】:

  • 我是个白痴,如果你看到了我的最后一条消息。它连载了。非常感谢。
【解决方案2】:

由于您的内容类型是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();
}

【讨论】:

  • 诚实吗?棒极了。现在马上尝试一下
  • 完全正确,正如我在回答中提到的那样,您还可以将整数映射到 int 类型(请参阅 e)。
  • 无效的 JSON 原语:b。这就是我得到的结果。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多