我是否必须对我的控制器操作方法执行任何特殊操作以接受/绑定.ajax()调用中的数据?
控制器操作 -
public class TestController : Controller
{
public JsonResult GetTestJsonData(Metadata data)
{
return new JsonResult { Data = data };
}
}
JQuery Call -
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
type: "POST",
url: "GetTestJsonData",
data: "{ data: {Name:'joe'}}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert("Name = " + msg.Name);
}
});
});
</script>
我希望这个页面会以“joe”的名字提醒。我将json数据从客户端传递给控制器操作,然后操作将其传递回客户端。这只是我想要做的一个简单的例子。
答案 0 :(得分:3)
您的代码可能适用于一个简单的示例,因为您没有解析任何内容,但是如果您想将JSON转换为控制器操作上的真实对象,那么您将需要告诉MVC如何去做。
有一篇关于编写JsonFilterAttribute的博客文章,该文章使用Json.NET对传入的JSON进行反序列化并将其转换为对象。
答案 1 :(得分:3)
其他答案需要自定义活页夹,但如果这不在您的应用程序范围内,则还有另一种方法。如果您的JSON属性与ActionResult方法上的参数匹配(即它不是复杂的JSON对象),则无需对POST进行反序列化。
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
type: "POST",
url: "GetTestJsonData",
data: "{ name:'joe', id:1, age:18 }",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert("Name = " + msg.Name);
}
});
});
</script>
以下ActionResult可以使用它:
public ActionResult GetTestJsonData(string name, int id, int age)
{
Metadata data = new Metadata(name, id, age);
return Json(data);
}
答案 2 :(得分:0)
编写一个了解JSON的自定义ModelBinder。您可以使用JSON库将其反序列化为对象,然后将其返回。
然后你的行动变成:
public ActionResult GetTestJsonData([JsonBinder] Metadata data)
{
return Json(data);
}
答案 3 :(得分:0)
我一直在使用System.Web.Script.Serialization命名空间中的JavaScriptSerializer类来取得巨大成功,但这并不简单。关键是您传递给控制器方法的javascript json对象需要与您尝试将其序列化的.NET对象具有相同的结构。例如,假设这是控制器中的目标.NET对象。
class TestObject {
public string Name {get;set;}
public int Age {get;set;}
}
然后你的JavaScript对象看起来像这样......
{Name: 'Lunchy', Age: 28}
然后在您的控制器中看起来像这样,(假设您在将javascript对象传递给控制器之前对其进行字符串化。我使用JSON.stringify(jsObj)方法)。
public JsonResult TestSerialization(string jsonString)
{
var jss = new JavaScriptSerializer();
TestObject to = jss.Deserialize<TestObject>(jsonString);
return Json(TestObject);
}
这是未经测试的代码,我特别不确定我的json对象语法,但希望你能得到这个想法。另请注意,MSDN可能会显示JavaScriptSerializer类已被标记为已弃用,但这已被撤消。它实际上是MVC框架用于执行json序列化的类。
答案 4 :(得分:0)
自从你解决了这个问题以来已经很长时间了,但我希望能够在未来通过类似的流程帮助你。
我不能直接谈论你已经接受的答案的问题(因为今天链接博客上的所有代码链接都已经死了),但是因为它使用的是Json.Net,我猜解决方案使用了这种技术来发送一个string to action方法,然后在action方法本身中使用Json.NET解析它。
这些技术绕过了Asp.net MVC 2+自动模型状态验证的强大功能。
我写了一篇博文,直接解决了这个问题,并提供了最简单的方法,让事情按预期进行。
我建议您阅读以供将来参考:
Sending complex JSON objects to Asp.net MVC using jQuery