2

単一ページの ASP.NET MVC 3 アプリケーションを開発しています。すべての投稿はajax呼び出しによって行われます。ユーザーはページ上のほとんどすべてを見ることができますが、一部のアクションではユーザーがログインする必要があります。

アクションにログインが必要な場合、ユーザーがログインしていない場合は a を返しJSON {unauthenticated: true}ます。したがって、次のようないくつかの成功ハンドラーがあります。

success : function(response){
  if(response.unauthenticated){
    showLoginDialog();
  } else {
    doTheActualWork();
  }
}

グローバルサクセスハンドラーでやりたいです。お気に入り:

$(document).ajaxSuccess(function (event, XMLHttpRequest, ajaxOptions){
  if(unauthenticated()){
    preventTheLocalSuccess();
    showLoginDialog();
  }
});

ローカルの成功ハンドラーは次のようになります。

success: function(response){
  // No Checking
  doTheActualWork();
}

それを行う方法はありますか?

4

2 に答える 2

4

dataFilterのプロパティを$.ajax確認する必要があります。このプロパティは、リクエストを受け取った直後で、ハンドラが実行される前に実行される関数を受け入れます。これの主な目的は、受信したデータを jQuery 自体で処理する前に前処理することです。したがって、データを受け取ります。ログインなどの中間プロセスをそこで実行できます。

この構成をすべての ajax 呼び出しにパッチするために、すべての ajax 要求$.ajaxSetupを事前定義dataFilterするために使用します。したがって、各 ajax リクエストには、dataFilterローカル ハンドラーが実行される前にハンドラーが実行されます。

サンプル コードについては、デモがあり、ほとんど期待どおりに動作します。

function login() {
    console.log('login initiated: you are not logged in');
}

$.ajaxSetup({
    dataFilter: function (origdata, type) {

        //the type is determined by the type you indicated in the ajax call
        //if not json, we return the data unharmed
        if (type !== 'json') return origdata;

        //data filter receives the raw response. since we have determined it's json
        //we parse it using jQuery's parseJSON to check the contents
        var data = $.parseJSON(origdata);

        if (data.auth) {
            //if logged in, we just return the data
            return origdata;
        } else {
            //otherwise, we execute the login
            //since returning something is required, we return false so local handler
            //data checks will fail against the false data
            login();
            return false;
        }
    }
});

//the url and data passed is for jsFiddle to work.

//logged in
$.post('/echo/json/', {
    json: JSON.stringify({
        auth: true
    })
}, function (data) {
    //in our handler, it's your normal "check data before use"
    //if data is truthy, it skips this check and moves on
    if(!data) return;
    console.log('data retrieved successfully', data);
}, 'json');

//not logged in
$.post('/echo/json/', {
    json: JSON.stringify({
        auth: false
    })
}, function (data) {
    //since we returned false, the code stops at this check
    if (!data) return;
    console.log('you should not see this since data is false, per dataFilter return', data);
}, 'json');
于 2013-04-28T04:35:47.817 に答える
2

JSON を返す代わりに、適切な HTTP エラー コードを返します。この場合は401 Unauthorized. その後、ajaxErrorメソッドを使用してそれを処理できます。

$(document).ajaxError(function (event, XMLHttpRequest, ajaxOptions){
    switch (xhr.status) {
        case 401: // Unauthorized
             // Take action, referencing xhr.responseText as needed.
            showLoginDialog();
            return false;
            break; 
      }
});

さらに、ajaxError条件を拡張して、失敗した他のリクエストを処理できます。

于 2013-04-28T03:32:41.367 に答える