var data = json_parse(msg.d)后ajax没有运行;

时间:2011-06-06 12:45:05

标签: c# asp.net ajax

这是我第一次玩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\"}";
}

2 个答案:

答案 0 :(得分:2)

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

更重要的是,你有一些冗余的序列化。当您使用ASP.NET ScriptServices和PageMethods时,let ASP.NET's built-in serializer do the work of converting your response to 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访问错误文本。

答案 1 :(得分:0)

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

  1. Go to Douglas Crockford's 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);

  6. 在不相关的旁注中,如果您更改此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;
    }