在ActionFilterAttribute
中執行重定向的最佳方式是什麼?我有一個名爲IsAuthenticatedAttributeFilter
的ActionFilterAttribute
並檢查了會話變量的值。如果該變量爲false,我希望應用程序重定向到登錄頁面。我寧願使用路由名稱SystemLogin
重定向,但是此時任何重定向方法都可以。從動作重定向過濾器屬性
回答
集filterContext.Result
隨着路由名稱:
filterContext.Result = new RedirectToRouteResult("SystemLogin", routeValues);
你也可以這樣做:
filterContext.Result = new ViewResult
{
ViewName = SharedViews.SessionLost,
ViewData = filterContext.Controller.ViewData
};
如果你想使用RedirectToAction
:
你可以做(最好是在它的基礎控制器),簡單地調用從System.Web.Mvc.Controller
保護RedirectToAction
您的控制器上的公共RedirectToAction
方法。添加此方法允許從過濾器公開呼叫 RedirectToAction
。
public new RedirectToRouteResult RedirectToAction(string action, string controller)
{
return base.RedirectToAction(action, controller);
}
那麼你的過濾器看起來是這樣的:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = (SomeControllerBase) filterContext.Controller;
filterContext.Result = controller.RedirectToAction("index", "home");
}
這可行,但不應該有一個RedirectToAction方法可用? – 2012-02-21 19:28:35
@BenMills然而,它是'受保護的',所以你不能從過濾器訪問它。 – James 2014-02-15 10:14:42
我現在的問題是爲什麼微軟決定讓這個過濾器保護'必須有一些合理的解釋?我覺得非常髒,重新定義'RedirectToAction'的這種可訪問性,而不理解它爲什麼被封裝在第一位。 – 2015-03-25 11:30:50
這聽起來像你想重新實現,或可能延長,AuthorizeAttribute
。如果是這樣,你應該確保你繼承了那個,而不是ActionFilterAttribute
,以便讓ASP.NET MVC爲你做更多的工作。
而且,你要確保你授權你做之前的任何實際工作的操作方法 - 否則之間的唯一區別登錄,而不是將你所看到的頁面,當工作完成。
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
// Do whatever checking you need here
// If you want the base check as well (against users/roles) call
base.OnAuthorization(filterContext);
}
}
試試下面的代碼片段,它應該是很清楚的:
public class AuthorizeActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(FilterExecutingContext filterContext)
{
HttpSessionStateBase session = filterContext.HttpContext.Session;
Controller controller = filterContext.Controller as Controller;
if (controller != null)
{
if (session["Login"] == null)
{
filterContext.Cancel = true;
controller.HttpContext.Response.Redirect("./Login");
}
}
base.OnActionExecuting(filterContext);
}
}
這對我有用,如果任何用戶試圖更改查詢字符串值並嘗試訪問未授權給他/她的數據,則我必須檢查查詢字符串值,而不是使用ActionFilterAttribute將其重定向到未授權的消息頁面。 – Sameer 2013-05-23 06:56:28
這很好。謝謝! – 2013-06-07 15:43:28
,你可以繼承你的控制器,然後用它你的動作過濾器
裏面你ActionFilterAttribute類中:
if(filterContext.Controller is MyController)
if(filterContext.HttpContext.Session["login"] == null)
(filterContext.Controller as MyController).RedirectToAction("Login");
在您的底座控制器內部:
public class MyController : Controller
{
public void RedirectToAction(string actionName) {
base.RedirectToAction(actionName);
}
}
缺點。這是改變所有控制器從「myController的」類繼承
另外一個重定向,如果調用自己的代碼,你可以這樣做:
actionContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new { controller = "Home", action = "Error" })
);
actionContext.Result.ExecuteResult(actionContext.Controller.ControllerContext);
它不是一個純粹的重定向,但給出了類似的結果沒有不必要的開銷
你幫我。謝謝! – 2015-01-08 16:13:59
這是正確的答案。 – 2015-02-27 15:09:27
請注意,您不應該在您的操作過濾器內調用actionContext.Result.ExecuteResult - MVC將在操作過濾器運行後自動執行此操作(提供的actionContext.Result不爲空)。 – NightOwl888 2016-02-24 19:41:58
我正在使用MVC4,我使用以下方法在授權違反時重定向自定義html屏幕。
擴展AuthorizeAttribute
說CutomAuthorizer
覆蓋的OnAuthorization
和HandleUnauthorizedRequest
在RegisterGlobalFilters
註冊CustomAuthorizer
。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomAuthorizer());
}
在識別unAuthorized
接入呼叫HandleUnauthorizedRequest
和如下所示重定向到所關注的控制器動作。
public class CustomAuthorizer : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool isAuthorized = IsAuthorized(filterContext); // check authorization
base.OnAuthorization(filterContext);
if (!isAuthorized && !filterContext.ActionDescriptor.ActionName.Equals("Unauthorized", StringComparison.InvariantCultureIgnoreCase)
&& !filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.Equals("LogOn", StringComparison.InvariantCultureIgnoreCase))
{
HandleUnauthorizedRequest(filterContext);
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result =
new RedirectToRouteResult(
new RouteValueDictionary{{ "controller", "LogOn" },
{ "action", "Unauthorized" }
});
}
}
- 1. 動作過濾器屬性
- 2. 從異常過濾器重定向
- 3. 從IIRF過濾器移動重定向/重寫規則到htaccess
- 4. 從過濾器重定向到JSP時傳遞屬性:會話vs請求
- 5. 從屬性重定向
- 6. 從控制器到自定義動作屬性過濾器的值
- 7. 如何使用Autofac「綁定」屬性到動作過濾器?
- 8. MVC過濾器動作重定向到無限循環
- 9. 如何讓過濾器重定向到另一個動作?
- 10. 發送帶動作過濾器的301重定向可以嗎?
- 11. ActiveAdmin從動態模型屬性中自定義過濾器
- 12. Lucene過濾器刪除重複屬性
- 13. 使用動作過濾器返回json,然後重定向到動作方法
- 14. Magento自定義屬性過濾器
- 15. 角ngtable過濾器自定義屬性
- 16. 會話過濾器重定向問題
- 17. ISAPI重定向3過濾器301重定向與子域
- 18. Sparql屬性過濾器
- 19. 過濾器相對屬性
- 20. 貓鼬屬性過濾器
- 21. 從屬性ASP.NET MVC重定向
- 22. ASP.NET Core重定向到使用自定義屬性的動作
- 23. 使用angularjs內置過濾器從代碼中過濾特定屬性
- 24. 過濾屬性
- 25. 打開圖像url時的動作過濾器屬性
- 26. 使用過濾器不工作將HTTP重定向到HTTPS
- 27. Angular.js通過過濾器指令的雙向('=')屬性
- 28. 重定向到指定的控制器和動作在asp.net mvc動作過濾器
- 29. 自定義屬性重定向導致「子動作不允許執行重定向動作」錯誤
- 30. 如何重定向我的行動過濾器類retrn視圖
** [檢查這個答案。希望這會對你有所幫助。](http://stackoverflow.com/a/18126733/2015869)** – 2013-08-12 08:53:51