代码之家  ›  专栏  ›  技术社区  ›  jaekie

在jquery和mvc中使用json的问题

  •  2
  • jaekie  · 技术社区  · 16 年前

    我正在尝试使用jquery从javascript执行控制器…这是我正在执行的jquery代码。

    <script type="text/javascript">
     $('form').submit(function (e) {
      e.preventDefault();
      $.ajax({
       type: "POST",
       url: $(this).attr("action"),
       data: $(this).serialize(),
       contentType: "application/json;charset=utf-8",
       dataType: "json",
       success: function(msg) {
        var obj = msg.deserialize();
        alert(msg);
       }
      });
     });
    </script>
    

    现在它确实执行了我的操作……

    这是它正在执行的控制器类的一个示例。

        [AcceptVerbs(HttpVerbs.Post)]
        [Url("Account/LogOn")]
        public virtual ActionResult LogOn(string Username, string Password)
        {
             if (Username == "test")
             {
                 return Json(new { Success = true });
             }
             else
             {
                 return Json(new { Success = false });
             }
        }
    


    问题是…当我运行方法时……它只是尝试下载包含结果的“登录”文件。如何将它放回jquery中的一个对象,以便正确地处理它,我已经尝试添加success标记并尝试检查msg,但它甚至没有运行它

    2 回复  |  直到 16 年前
        1
  •  2
  •   Darin Dimitrov    16 年前

    把你的剧本放进去 document.ready 在尝试注册任何尚未加载DOM的事件处理程序之前:

    <script type="text/javascript">
        $(function() {
            // ... copy - paste your script here
        });
    </script>
    

    也不需要设置 dataType ,jquery从服务器的内容类型响应头了解它。另一个备注:传递给成功处理程序的msg对象已经是一个json对象:您不需要解析/反序列化它:

    <script type="text/javascript">
    $(function() {
        $('form').submit(function() {
            $.ajax({
                type: 'POST',
                url: $(this).attr('action'),
                data: $(this).serialize(),
                success: function(msg) {
                    alert(msg.Success);
                }
            });
            return false;
        }
    });
    </script>
    

    我建议你的解决方案是 jquery.form 插件。多亏了它,您的JS代码看起来就像:

    <script type="text/javascript">
    $(function() {
        $('form').ajaxForm(function(msg) {
            alert(msg.Success);
        });
    });
    </script>
    

    非常干净的东西。您不必为序列化/反序列化数据、防止默认事件而烦恼,它甚至可以处理 file uploads .

        2
  •  0
  •   jAndy    16 年前

    HIDD增强

    var obj = msg.deserialize();
    

    如果这不是一个笑话,你会发现一个隐藏的特征:)

    如果您使用的是jquery v.1.4.x,则不需要手动解析JSON字符串。 使用旧版本,尝试

    var obj = window.JSON.parse(msg);