5

jQueryPOSTを介してサーバーに送信されるフォームがあります.ajax()。フォームがサーバー側で検証に合格した場合、サーバーはクライアント側がそれに応じてプレゼンテーションを更新するためにHTMLで結果を返します。ただし、フォームが検証に失敗した場合、サーバーは検証エラーで構成されるJSONで結果を返します。

どちらのタイプの結果も、最終的にはのsuccessハンドラーになり.ajax()ます。どちらのタイプも可能であるため、ハンドラーには、結果がHTMLであるかJSONであるかを判別する方法が必要です。どうやってやるの?

注:一見すると、私の質問はこの既存のSO質問と同じように見えますが、同じではありません。その質問では、可能なデータ型(HTMLまたはJSON)は1つだけですが、私の問題は、2つの可能なデータ型(HTMLJSON)を処理する方法を見つけることです。

4

5 に答える 5

5

パラメータを空白のままdataTypeにすると、jQuery は MIME タイプに基づいてこれを決定します。

dataTypeString

デフォルト: Intelligent Guess (xml、json、script、または 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 アクションから返されたデータでは機能します。jquery が返されたデータを処理する方法を決定するのは MIME タイプだと思います。

于 2012-04-16T18:03:37.060 に答える
2

typeof を使用すると、扱っているデータの typeof が報告されます。

フィドル

于 2012-04-16T18:04:13.187 に答える
2

eval()jQuery に供給しているデータが悪意のある XSS 攻撃を受けていないことが 100% 確実な場合は、JavaScript の方法を有利に使用できる可能性があります。

私が使用した厄介なものを交換する提案をしてくれた@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指定されたは、jQuery が解析しようとしないようにする必要があることに注意してください。$.ajax()text


私たちは皆、生活を少し楽にしてくれる代替案が大好きです。常にJSON オブジェクトを返さ
ないのはなぜですか? おそらくこのようなもの:

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

エラーの場合:

{"err":"1","message":"You did not foo all of your bars yet!"} 
于 2012-04-16T17:59:43.170 に答える
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 に答える