2014-03-25 32 views
1

在MVC應用程序,我有一個jQuery阿賈克斯後一種方法在控制器:隊阿賈克斯.fail()來管理登錄重定向

function initFormForInsert(metodoLoadForm, nomeForm, divForm, widthForm, heightForm, metodoInsert) { 
    blockPage(); 
    var request = $.ajax(
     { 
      type: 'POST', 
      url: getRootURL() + metodoLoadForm 
     }); 

    request.done(function (data) { 
    //alert(data); 
    LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert); 
}); 

request.fail(function (jqXHR, textStatus) { 
     unblockPage(); 
     showErrorDialog("Error", textStatus); 
    }); 
} 

我可以強制request.fail()以某種方式?

因爲我在我的控制器(代碼如下)中使用全局過濾器來授權我的所有方法 特別是當我收到此Ajax帖子並且我的會話變量爲空時我想引發異常。

protected override bool AuthorizeCore(HttpContextBase httpContext) { 
    try { 
     UserToken cUt = httpContext.GetUser(); 
     if (cUt == null) { 
      //session is null 
      return false; 
     } 
     string request = httpContext.Request.Path; 
     if (httpContext.Request.Path.LastOrDefault() == '/') 
      request = httpContext.Request.Path.Remove(httpContext.Request.Path.Length - 1); 
     if (cUt.DeniedActions.Contains(request.ToUpper())) { 
      //user is not authorized 
      return false; 
     } 
     return true; 
    } catch (Exception) { 
     return false; 
    } 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
    UserToken cUt = filterContext.HttpContext.GetUser(); 
    if (cUt == null) { 
     //session is null 
     if (
      //filterContext.HttpContext.Response.StatusCode == 302 && 
      filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest" 
     ) { 
      //filterContext.HttpContext.Response.Clear(); 
      filterContext.HttpContext.Response.StatusCode = 401; 
     } else { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary(
        new { 
         controller = "Login", 
         action = "Login" 
        }) 
      ); 
     } 
    } 

我已經修改了的JavaScript對話框是這樣的:

function initFormForInsert(metodoLoadForm, nomeForm, divForm, widthForm, heightForm, metodoInsert) { 
    blockPage(); 
    var request = $.ajax(
      { 
       type: 'POST', 
       url: getRootURL() + metodoLoadForm, 
       statusCode: { 
        200: function (data) { 
         //alert(200); 
        LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert); 
        }, 
        401: function (jqXHR, textStatus, errorThrown) { 
         //alert(401); 
        hrefTo("/Login/Login") ; 
       } 
       } 

      }); 

    //request.done(function (data) { 
    // //alert(data); 
    // LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert); 
    //}); 

    request.fail(function (jqXHR, textStatus) { 
     unblockPage(); 
     showErrorDialog("Errore inizializzando la form per inserimento ", textStatus); 
    }); 

} 

和授權是這樣的:

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    try 
    {   
     UserToken cUt = httpContext.GetUser(); 

     if (cUt == null) 
      //session is null 
     { 
      return false; 

     } 

     string request = httpContext.Request.Path; 

     if (httpContext.Request.Path.LastOrDefault() == '/') 
      request = httpContext.Request.Path.Remove(httpContext.Request.Path.Length - 1); 

     if (cUt.DeniedActions.Contains(request.ToUpper())) 
     { 
      //user is not authorized 
      return false; 
     } 

     return true; 

    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    UserToken cUt = filterContext.HttpContext.GetUser(); 

    if (cUt == null) 
    { 
     // session is null     
     if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
     { 
      filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
      filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
      filterContext.HttpContext.Response.End(); 
      return; 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(
        new RouteValueDictionary(
         new 
         { 
          controller = "Login", 
          action = "Login" 
         }) 
        ); 
     } 
    } 
} 

你覺得好嗎?

或者,即使慢,可以當一個if brench 檢查在會話變量添加另一種方法

blockPage(); 
    if (checkSessionVariable()) { 
     hrefTo("/Login/Login"); 

    } 
    else { 
     var request = $.ajax(
       { 
        type: 'POST', 
        url: getRootURL() + metodoLoadForm, 


       }); 

     request.done(function (data) { 
      //alert(data); 
      LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert); 
     }); 

     request.fail(function (jqXHR, textStatus) { 
      unblockPage(); 
      showErrorDialog("Errore inizializzando la form per inserimento ", textStatus); 
     }); 
    } 

其中檢查會話變量是另一個帖子裏面檢查會話變量

function checkSessionVariable() { 

    var request = $.ajax(
    { 
     type: 'POST', 
     url: getRootURL() + "/Login/SessionExpired" 
    }); 

    request.done(function (data) { 
     return (data); 
    }); 

    request.fail(function (jqXHR, textStatus) { 

     return 0; 
    }); 

} 

也許這是一個更可靠的解決方案?

+0

是,則返回一個頭,是不是'2xx'例如,'500'或'403' –

+0

謝謝凱文此刻的代碼上面的不工作可能是由於缺乏標題.. JavaScript是總是request.done ..我嘗試把標題 – user2743368

回答

0

不建議給500或403錯誤作爲解決方法。請記住這些狀態代碼這意味着N/W故障未找到資源

相反,嘗試從服務器處理您的結果爲負的情況 的積極響應,這意味着數據現在需要處理如下

request.done(function (data) { 
     //alert(data); 
     if(data.positive) { 
LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert); 
} 
else if(data.negative){ 
unblockPage(); 
     showErrorDialog("Error", textStatus); 
} 
    }); 

您可以將Cookie太例如(以下僞代碼)

request.done(function (data) { 
      //alert(data); 
      if(cookie == "positive") { 
    LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert); 
    } 
    else if(cookie == "negative"){ 
    unblockPage(); 
      showErrorDialog("Error", textStatus); 
    } 
     });