2015-06-17 62 views
1

我試過了這2種不同的方式MVC篩選器動作重定向

這種方式可行,但在執行重定向之前處理所有動作的代碼。這將導致在以往任何時候,我們使用的是抗僞造令牌的問題

public class CheckAjaxRequestAttribute : ActionFilterAttribute 
{ 
    private const string AJAX_HEADER = "X-Requested-With"; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     bool isAjaxRequest = filterContext.HttpContext.Request.Headers[AJAX_HEADER] != null; 
     if (!isAjaxRequest) 
     { 
      filterContext.HttpContext.Response.Redirect("/"); 
     } 
    } 
} 

我見過第二個方法建議我收到以下錯誤 「孩子的行爲是不允許進行重定向操作。」

 public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.Buffer = true; 
     bool isAjaxRequest = filterContext.HttpContext.Request.Headers[AJAX_HEADER] != null; 
     string redirectUrl = string.Format("{0}://{1}/", filterContext.HttpContext.Request.Url.Scheme, filterContext.HttpContext.Request.Url.Authority); 
     if (!isAjaxRequest) 
     { 
      //filterContext.HttpContext.Response.Redirect("/"); 
      filterContext.Result = new RedirectResult(redirectUrl); 

     } 
    } 
} 

這樣做的目的是防止加載在局部視圖時不通過AJAX被調用。代碼正常工作,但重定向錯誤和我們的安全掃描在@Html.AntiForgeryToken()引發錯誤時發現問題。

任何幫助將不勝感激。

+0

請添加一個標籤在您的代碼段使用的編程語言(我認爲這是C#)。 – Kryptos

+0

如果您取消了「ChildActionOnly」屬性,第二種方法將起作用。 – mattytommo

+0

我沒有使用ChildActionOnly屬性 –

回答

0

爲了您isAjaxRequest,你就應該能夠使用:

filterContext.HttpContext.Request.IsAjaxRequest(); 
+0

感謝您的提示,我已更改我的代碼來使用它,但它不能解決我的問題。 –

+0

對不起,我會把它放在評論中而不是答案中,但我還沒有評論權限。無論如何,我以前見過的方式是使用自定義的ActionMethodSelectorAttribute(「CheckAjaxRequestAttribute:ActionMethodSelectorAttribute」)並重寫IsValidForRequest方法,如果它不是Ajax請求,則返回false。不幸的是,我認爲如果它是假的,它將返回一個404,如果你真的需要它重定向到默認頁面,它將不會給你開箱即用的重定向。 – dgavian

相關問題