我终于试着尝试使用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
因此失败。我该如何解决这个问题?
答案 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; }
}