【问题标题】:Passing data from JQuery to Controller Action将数据从 JQuery 传递到控制器动作
【发布时间】:2009-03-18 17:44:52
【问题描述】:

我是否必须对我的控制器操作方法执行任何特殊操作才能接受/绑定来自 .ajax() 调用的数据?

控制器动作 -

public class TestController : Controller
{
    public JsonResult GetTestJsonData(Metadata data)
    {
        return new JsonResult { Data = data };
    }
}

JQuery 调用 -

<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 数据从客户端传递到控制器操作,然后操作将其传递回客户端。这只是我正在尝试做的一个简单示例。

【问题讨论】:

    标签: jquery asp.net-mvc ajax


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      其他答案需要自定义活页夹,但如果这超出了您的应用程序范围,还有另一种方法。如果您的 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);
      }
      

      【讨论】:

      • 不是我正在寻找的答案,但有很好的信息,谢谢。
      【解决方案3】:

      编写一个可以理解 JSON 的自定义 ModelBinder。您可以使用 JSON 库将其反序列化为您的对象,然后将其返回。

      那么你的动作就变成了:

      public ActionResult GetTestJsonData([JsonBinder] Metadata data)
      {
         return Json(data);
      }
      

      【讨论】:

        【解决方案4】:

        我一直在使用 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 序列化的类。

        【讨论】:

          【解决方案5】:

          您已经很久没有解决这个问题了,但我的回答希望在未来通过类似的流程帮助您

          我无法直接谈论有关您已接受的答案的问题(因为链接博客上的所有代码链接到今天都已失效),但由于它使用 Json.Net,我猜该解决方案使用了该技术来发送string 到 action 方法,然后在 action 方法本身中使用 Json.NET 对其进行解析。

          这些技术绕过了强大的 Asp.net MVC 2+ 自动模型状态验证功能。

          我写了一篇博文,直接解决了这个问题,并提供了使事情按预期工作的最简单的方法。

          我建议您阅读它以备将来参考:
          Sending complex JSON objects to Asp.net MVC using jQuery

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-29
            • 2021-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-06
            相关资源
            最近更新 更多