5

これが質問にタイトルを付ける正しい方法であるかどうかさえわかりません。私は自分のAJAX呼び出しをすべて間違っていることを知っています...これが私が今していることです(ちなみにASP.NET MVCバックエンドを使用しています):

いくつかのデータをアクションに投稿するために使用jQuery.ajaxします。アクションは、応答でキャプチャしたビューをロードします。基本的には、アクションにデータを提供し、HTML を取り戻します。

検証済みの Ajax 呼び出しを作成したいとしましょう。エラー時に検証メッセージを取得するにはどうすればよいですか? たとえば、Ajax ログイン フォームです。ユーザーが検証できない場合は、単に何もしないのではなく、そのように伝えたいと思います。

素朴な質問で申し訳ありませんが、Google で解決策を見つけるために正しい言葉で表現する方法がわかりません。

前もって感謝します!

4

4 に答える 4

7

まず第一に、スクリプトで使用する予定のデータを AJAX 呼び出しで返したい場合 (つまり、そのデータを で表示するよりも複雑なことを意味しますdiv)、おそらくサーバーから HTML ではなく JSON データを返す必要があります。JSON は実際には JS オブジェクトであるため、受け取った瞬間に JS で使用できます。

したがって、データを返す場合、つまり

{id: 1, status: 'ok'}

このようなものを使用して、そのデータを使用できます。

$.ajax({
    url: "your/script/url",
    type: "POST",
    data: {login : 'foo', pass: 'bar'}, // whatever the data is
    dataType: "json",
    success: function(data){
        if (data.status === 'ok') {
            console.log('success');
        } else {
            console.log('error');
        }
    }

});

于 2009-08-12T06:04:48.773 に答える
5

応答のために複数の情報を返す必要があります。幸いなことに、これは JSON を使用して簡単に行うことができます。応答タイプが json であると jQuery に伝えれば、jQuery が自動的に処理してくれます。ajax コールバック関数に取得するオブジェクトには、必要なすべてのデータがさまざまなプロパティとして含まれます。

各 ajax 呼び出しで「成功」または「失敗」のステータス コードと、エラーのコレクションを返す習慣を身につけることをお勧めします。 私が言いたいことの詳細については、この素晴らしいブログ投稿を参照してください。

この理由は、サーバーが実際にリクエストを処理できず、失敗の http ステータス コードを返さない限り、ajax 呼び出しは常に基本的に「成功」​​するためです。要求の結果が検証エラーのようなものであるにもかかわらず、サーバーが何らかのテキスト応答を返す場合、アプリケーション操作が失敗したとしても、ajax 呼び出しは成功したと見なされます。

したがって、アクション メソッドで、アクション結果で html データを返す代わりに、次のようなオブジェクトを返した場合:

public class AjaxResponse
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
        /// This creates an AjaxResponse that by default indicates SUCCESS.
        /// </summary>
        public AjaxResponse()
        {
            Success = true;
            Data = new List<object>();
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
        /// This creates an AjaxResponse that indicates FAILURE.
        /// </summary>
        /// <param name="exception">The exception.</param>
        public AjaxResponse(Exception exception)
            : this()
        {
            Success = false;
            Errors = new [] { exception.Message };
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
        /// This creates an AjaxResponse that indicates SUCCESS.
        /// </summary>
        /// <param name="data">The data.</param>
        public AjaxResponse(object data)
            : this()
        {
            Data = data;
        }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="AjaxResponse"/> is success.
        /// </summary>
        /// <value><c>true</c> if success; otherwise, <c>false</c>.</value>
        public bool Success
        {
            get; set;
        }

        /// <summary>
        /// Gets or sets the data.
        /// </summary>
        /// <value>The data.</value>
        public object Data
        {
            get; set;
        }

        /// <summary>
        /// Gets or sets the errors.
        /// </summary>
        /// <value>The errors.</value>
        public string[] Errors
        {
            get; set;
        }
    }

これは、プロパティ「.Success」、「.Data」、および「.Errors」を持つ JavaScript オブジェクトに変換されます。

したがって、検証コードが Errors 配列にすべての検証エラーを入力していた場合、ajax コールバック関数で簡単に

  1. SUCCESS プロパティが "failure" に設定されているため、呼び出しの意図した目的が失敗したと判断します。

  2. 関連するすべてのエラー文字列を取得します。

アクションメソッドでこの種のパターンを使用すると、これを簡単に実行できます。

    try
    {
        instance.Validate();
        return Json(new AjaxResponse(myHtmlData));
    }
    catch(Exception ex)
    {
        var response = new AjaxResponse(ex);

        // Get your validation errors here, put them into
        // your ajax response's Errors property.

        return Json(response);
    }
于 2009-08-12T06:08:19.063 に答える
2

私はこれと同じ状況についてブログに書いています。たぶん、あなたの状況でもあなたを助けるでしょう。基本的には、エラーを返すカスタム例外クラスと例外アクション属性を持つことです。したがって、呼び出しのオプションsuccesserrorオプションを使用できます。$.ajax私の意見では、これが正しい方法です。

$.ajaxcall は、成功応答とエラー応答を処理する機能を提供します。クライアントでチェックする必要があるエラー フラグを設定して、常に成功を返す必要はありません。

于 2010-11-19T14:28:53.513 に答える
0

私はあなたの言いたいことを完全に理解したかどうか確信が持てません。ただし、エラー時の検証メッセージの例は、次のようには機能しません。

  1. ユーザーが何らかのボタン/リンクをクリックすると、アクションが発生します
  2. 非同期の投稿がサーバーに返され、ユーザー ID が送信されます (ここでセキュリティに注意する必要があります)。
  3. サーバー上で必要な検証が行われ、応答が返されます (XML、Json、HTML としてエンコードされたメッセージが直接送信されます)。
  4. クライアント側に戻り、JavaScript コードで応答を取得し、それをページに適切に配置します。

それが役立つことを願っています。

于 2009-08-12T06:08:11.560 に答える