这是我第一次玩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\"}";
}
答案 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的更好方法就是这样。
现在在您从中提取数据的页面上引用脚本
<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;
}