2014-02-11 51 views
1

響應所以基本上我有一個自定義ActionFilterAttribute和它我重寫一個方法,它看起來像這樣ASP.NET MVC 4重定向在ActionFilterAttribute

public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) 
{ 
    bool shouldEnter = true; 
    string redirUrl = "SomeController/SomeAction"; 
    // some checks here which change the value of shouldEnter; 
    if (!shouldEnter) 
    { 
     filterContext.HttpCOntext.Response.Redirect(redirUrl); 
    } 
} 

這是一個非常簡單的實現的ActionFilterAttribute。基本上我檢查一些東西,而不是決定讓那個人進去。如果我不讓他進入,那麼我應該將他重定向到某個URL,並使用上述OnActionExecuting方法執行此操作。但事情是,在它進入someUrl之前,他所要求的行動首先被執行。假設我已請求~/SomeController/YouShouldNotEnterHere的頁面,並且此操作具有該屬性。 OnActionExecuting被調用,並且我認爲redirUrl(在OnActionExecuting方法中提到)的相應動作將被調用,因爲我將Response重定向到它,但是不,首先調用/ SomeController/YouSnouldNotEnterHere的對應Action實際上在瀏覽器中繪製,但動作仍然消耗時間),並且調用(並在瀏覽器中繪製)redirUrl的相應動作。這是一種錯誤嗎?或者這應該以這種方式工作?反正我有什麼可以做T

+2

可能重複[ASP.NET MVC:Response.Redirect(url,TRUE)不會停止請求處理](http://stackoverflow.com/questions/2187323/asp-net-mvc-response-redirecturl-true-does-not-停止請求處理) – CodeCaster

+1

'filterContext.Result = new RedirectResult {Url = redirUrl};' – felickz

+0

@felickz實際上幫助編寫答案所以我可以標記它。 – Dimitri

回答

3

這聽起來像你正在做的授權,在這種情況下使用正確的屬性是AuthorizeAttribute

這將代碼將解決您的現有屬性:

filterContext.Result = new RedirectResult { Url = redirUrl }; 
+0

所以你想說我無法實現我想要使用ActionFilterAttribute? – Dimitri

+0

@Dima用你現有的屬性重定向的方式編輯我的帖子 – felickz

+0

爲什麼'AuthorizeAttribute'存在有一個特定的原因。它在任何ActionFilterAttribute之前運行,這意味着如果你不使用它,就有可能創建一個安全整體。 –