ajax未在var data=json_parse(msg.d);之后运行;

本文关键字:msg 之后 运行 parse var 未在 data json ajax | 更新日期: 2023-09-27 17:58:25

这是我第一次使用Ajax。我现在正试图创建一个基本的登录名。无论如何,我有以下脚本。。

     <script language = "javascript">
            function Login() {  
                       $.ajax({
                        type: "POST",
                        url: "ajax.aspx/Login",
                        data: '{' +
                                'username:"' + $('#username').val() + '",' +
                                'password:"' + $('#password').val() + '"' +
                               '}',
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function(msg) {
                            alert("alert1");
                            var data = json_parse(msg.d);
                            alert("alert2");
                            if (!data.error) {
                                alert("No Error);
                            }
                            else {
                                alert(data.error);
                            }
                        },
                        error: function(msg) {
                            alert('Failure: ' + msg);
                        }
                    });         
            }
    </script>

由于某些原因,它在var data=json_parse(msg.d)之后不运行任何内容;

它显示了前两个警报,但在之后进行了注释。

ajax页面具有以下`

[WebMethod]
public static string Login(string username, string password)
{
    return "{'"error'": '"No IDs'"}";
}

ajax未在var data=json_parse(msg.d);之后运行;

首先,JavaScript没有内置的json_parse()函数。除非您自己定义过,否则它可能会引发JavaScript错误。较新浏览器中可用的标准客户端实用程序是JSON.parse()

更重要的是,您已经在那里进行了一些冗余的序列化。当您使用ASP.NET ScriptServices和PageMethods时,让ASP.NET的内置序列化程序完成将响应转换为JSON的工作是很重要的。

现在,您的WebMethod返回了一堆双序列化的JSON,看起来像这样:

{d:{'"{'"error'": '"No IDs'"}'"}

由于您已将dataType设置为json,jQuery在运行成功或错误处理程序之前已经在运行JSON解析操作,但它只是将第一级JSON转换为JavaScript对象。不幸的是,这只会导致.d包含另一个JSON字符串。

如果你让ASP.NET为你做这项工作,你可以在WebMethod中使用这样的东西:

[WebMethod]
public static string Login(string username, string password)
{ 
  return "No IDs";
}

然后,客户端上的事情会更顺利:

success: function(msg) {
  if (!msg.d) {
    alert("No Error);
  } else {
    alert(msg.d);
  }
},

如果你真的想保留error作为错误消息的密钥,你可以这样做:

[WebMethod]
public static object Login(string username, string password)
{ 
  return new { error = "No IDs" };
}

或者,甚至使用一个定义的类:

public class ErrorResponse
{
  public string error { get; set; }
}
[WebMethod]
public static ErrorResposne Login(string username, string password)
{ 
  var response = new ErrorResponse();
  response.error = "No IDs";
  return response;
}

在后一种情况下,一旦错误文本到达客户端,就可以通过msg.d.error访问它。

函数json_parse内部有什么?该函数可能是您的错误来源。一个更好的解析JSON的方法是这样的。

  1. 转到Douglas Crockford的Github JSON js/json2.js并复制它
  2. 在jscompress.com上最小化它并复制压缩的代码(可以跳过这一步)
  3. 将其粘贴到Application文件夹中的某个位置,作为json2.js
  4. 现在,在您从
    中提取数据的页面上引用脚本<script src="path/to/script/json2.js" type="text/javascript"></script>

  5. 现在在函数内部,像这样解析JSON
    var data = JSON.parse(msg.d);

在一个不相关的附带说明中,如果您像这样更改error以有效地捕捉错误,效果会更好。

error: function (xhr, status, error) {
    alert(xhr.statusText);
}

另外,像这样调用WebMethod

[WebMethod]
public static string Login(string username, string password)
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    dynamic obj = new ExpandoObject();
    obj.error = "No IDs";
    string str = js.Serialize(obj);
    return str;
}