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'"}";
}
首先,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的方法是这样的。
- 转到Douglas Crockford的Github JSON js/json2.js并复制它
- 在jscompress.com上最小化它并复制压缩的代码(可以跳过这一步)
- 将其粘贴到Application文件夹中的某个位置,作为json2.js
-
现在,在您从
中提取数据的页面上引用脚本<script src="path/to/script/json2.js" type="text/javascript"></script>
-
现在在函数内部,像这样解析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;
}