5

我有一个通过 jQuery .ajax()POST 提交到服务器的表单。如果表单通过了服务器端的验证,服务器将返回 HTML 格式的结果,以便客户端相应地更新其表示。但是,如果表单验证失败,服务器将以 JSON 格式返回结果,其中包含验证错误。

两种类型的结果都会success.ajax(). 由于这两种类型都是可能的,因此处理程序需要一种方法来确定结果是 HTML 还是 JSON。我怎样才能做到这一点?

注意:从表面上看,我的问题看起来与这个现有的 SO 问题相同,但它们并不相同。在那个问题中,只有一种可能的数据类型(HTMLJSON),而我的问题是寻找一种方法来处理两种可能的数据类型(HTMLJSON)。

4

5 回答 5

5

如果您将dataType参数留空,jQuery 将根据 MIME 类型确定:

数据类型字符串

默认值:智能猜测(xml、json、脚本或 html)

您期望从服务器返回的数据类型。如果没有指定,jQuery 将尝试根据响应的 MIME 类型推断它

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

于 2012-04-16T17:54:21.957 回答
3

对于 json 数据,typeof(data)将为object. 对于 html 数据,它将是string.

至少对于从 ASP.NET MVC3 操作返回的数据,它可以工作。我假设是 mime 类型决定了 jquery 如何处理返回的数据。

于 2012-04-16T18:03:37.060 回答
2

如果您 100% 确定您提供给 jQuery 的数据没有恶意 XSS 攻击,那么您可以使用 JavaScript 的eval()方法来发挥您的优势。

感谢@SLaks提出换掉我用过 的讨厌的建议。eval()

您可以使用$.parseJSON将原始文本字符串转换为 JSON 对象

function ajaxResponse(raw_data){
  try{
    // eval("var response="+raw_data); // try and avoid this if possible
    var response = $.parseJSON(raw_data);
    if (response){
      // We have a JSON inside the 'response' variable!
    }
  } catch(e){
    // We do not have a JSON.
    // Probably HTML content.
    // Might be a malformed JSON.
  }
}

如代码中所述,请注意,如果您传递格式错误的 JSON 对象,那么您的回调会将其视为 HTML。

请注意,dataType您的调用指定的$.ajax()必须是textjQuery 不会尝试为您解析它。


我们都喜欢让我们的生活更轻松的替代方案 - 这里有一个适合您的情况。
为什么不总是返回 JSON 对象?可能是这样的:

{"err":"","html":"<div>foobar<\/div>"} 

对于错误:

{"err":"1","message":"You did not foo all of your bars yet!"} 
于 2012-04-16T17:59:43.170 回答
2

使用 typeof,它将报告您处理的数据类型。

小提琴

于 2012-04-16T18:04:13.187 回答
1

为什么不只使用 JSON 来返回 HTML 呢?

我通常做的是像这样设置我返回的 JSON 对象:

{
  //s=status, d=data
  "s":0, //0 means success, other numbers are for different errors
  "d":{ /* Other JSON object or string here */ }
}

所以,在你的情况下,你会做这样的事情(伪):

if (StuffIsValid()) {
    ResponseWrite('{"s":0,"d":"<html>html code here</html>"}');
} else {
    ResponseWrite('{"s":1,"d":{"errlist":["err1","err2"]}}');
}

当然,您希望使用内置 JSON 库作为您选择的服务器端语言,而不是使用字符串。

然后,在您的 jQuerysuccess回调中,我会检查 s 的值。

$.ajax({
    url: 'url',
    dataType: 'json',
    success: function(data) {
        if (data) {
            //We have a JSON object
            if (data.s === 0) {
                //Success!
                //Do stuff with data.d as a string
            } else if (data.s === 1) {
                //Failed validation
                //Do stuff with data.d as an object
            } else {
                //How did this happen?
            }
        } else {
            //Uh oh, no object, user must have been logged out (or something)
        }
    });

如果用户必须登录才能访问您发布到的页面,这将特别有用,因为您可以发现返回的数据不是 JSON 对象这一事实。

于 2012-04-16T20:14:51.873 回答