0

我有一个带有一些 JS 代码的 HTML 页面,它是从 Android 加载的WebView。此 JavaScript 使用jQuery-post-function调用HandleAndroidJSON.aspx带有数据的 -site,并返回带有data-、status-(和jqXhr-)参数的回调函数:

function syncWithServer() {
    var dataToSend = Android.getDataToSend();
    $.post("HandleAndroidJSON.aspx", { data: dataToSend }, callbackDataFromServer);
}

function callbackDataFromServer(data, status) {
    Android.setDataFromServer(data, status);
}

“Android”变量是JavaScriptInterface在 Android 中创建的,它可以从 JS 调用 Android 方法。

在我的HandleAndroidJSON.aspx.cs-file 中,我根据从 Android 收到的数据写了一个响应:

public partial class HandleAndroidJSON : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        Response.Clear();
        Response.ContentType = "text/plain";

        // Read request parameter and deserialize JSON data.
        string jsonDataFromClient = Request.Params["data"];

        // ... Do stuff with the data ...

        if (error != null)
        {
            //This goes into the data-parameter of the callbackFunction
            Response.Write(error); 
            //Response.Status = "403 Error"; //This seems to only be HTTP-status responses,
                                   //not the one used as parameter in the callback-function
        }
        else
        {
            //This does too
            Response.Write(jsonDataToSend); 
        }
        Response.End();
    }
}

- 方法按预期在回调函数的- 参数中Response.Write()返回data,但我似乎无法设置status- 参数 -它总是返回相同的字符串:“成功”并且如果我设置 - 属性也不会改变Response.Status

所以问题很简单,如何从 aspx.cs-code 设置 -function 的status-parameter callbackDataFromServer(从 jQuery-post-function 调用)?

编辑:我不是在谈论HTTP 的状态代码。设置 -property 的StatusDescription-、StatusCode- 和Status- 属性Response不会更改status回调函数的 -parameter。

EDIT2:我认为处理 JavaScript 代码中的状态参数不能解决问题,因为无论如何我都必须再次验证 Android 中的数据(因为可以通过 JavaScript 注入来避免错误处理)。callbackDataFromServer正如当前代码所示,我想通过 -function 中的 status-parameter 将它传递给 Android-method 。

EDIT3:即使我似乎无法找到是否可以从 aspx 代码中设置 -parameter 的直接答案,但除了-parameterstatus之外,您唯一可以更改的似乎是可以设置的属性成为aspx 站点中的属性。datajqXhr.statusResponse.StatusCode

还有jqXhr.statusText一个包含字符串的属性,但它似乎是基于状态代码的默认文本,而不是Response.StatusDescription(将状态代码设置为 200,将状态描述设置为“成功”返回为“确定”,这是默认的状态码 200)。

这是我正在阅读的主题:Get the jqXhr.responseText on a jQuery getJSON request using JSONP

EDIT4:我现在发现将 设置StatusCode为一个值,这意味着出现问题,将导致没有数据被发送,即使Response.Write()- 方法已被调用,这违背了我试图实现的目的。

那么正确的问题是:如果出现问题,我如何正确传递错误文本(来自 ASP.NET,通过 jQuery),而不是数据?以及如何确保我正在传输的数据是错误或 JSONData? 我认为简单的方法是检查数据是否以“{”或“[”开头,但我觉得这有点像黑客。

4

1 回答 1

2

为了获取状态码,您可以使用status成功回调的第三个参数的属性jqXHR,这里是小提琴http://jsfiddle.net/prD5c/

所以你的功能看起来像

function callbackDataFromServer(data, status,jqXhr) {
    console.log(jqXhr.status);
    Android.setDataFromServer(data, status);
}

你可以使用statusCode类似的

$.ajax({
  statusCode: {
    202: function() {
      alert("success");
    },
    403:function(){
      alert(error);
    }
  }
});

当您使用$.post时,您可以ajaxSetup像这样定义它

$.ajaxSetup({
      statusCode: {
        202: function() {
          alert("success");
        },
        403:function(){
          alert(error);
        }
      }
    });

http://api.jquery.com/jQuery.ajax/

于 2012-05-30T21:14:52.370 回答