将数据从JQuery传递到Controller Action

时间:2009-03-18 17:44:52

标签: jquery asp.net-mvc ajax

我是否必须对我的控制器操作方法执行任何特殊操作以接受/绑定.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数据从客户端传递给控制器​​操作,然后操作将其传递回客户端。这只是我想要做的一个简单的例子。

5 个答案:

答案 0 :(得分:3)

您的代码可能适用于一个简单的示例,因为您没有解析任何内容,但是如果您想将JSON转换为控制器操作上的真实对象,那么您将需要告诉MVC如何去做。

有一篇关于编写JsonFilterAttribute的博客文章,该文章使用Json.NET对传入的JSON进行反序列化并将其转换为对象。

http://blogger.forgottenskies.com/?p=252

答案 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