如何让过滤器重定向到另一个操作?
RedirectToAction
是受保护的,我们只能在操作中使用它。 但是如果我想在过滤器中重定向呢?
public class IsGuestAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
filterContext.Result = (filterContext.Controller as Controller)
.RedirectToAction("Index", "Home");
}
}
RedirectToAction
is protected, and we can use it only inside actions. But if I want to redirect in a filter?
public class IsGuestAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
filterContext.Result = (filterContext.Controller as Controller)
.RedirectToAction("Index", "Home");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
RedirectToAction
只是构造RedirectToRouteResult()
的辅助方法,因此您只需创建一个新的RedirectToRouteResult()
并传递RedirectToRouteResult()
即可。 code>RouteValueDictionary() 包含您的操作的值。基于以下评论中 @Domenic 的代码完成示例:
RedirectToAction
is just a helper method to construct aRedirectToRouteResult()
, so what you do is simply create a newRedirectToRouteResult()
passing along aRouteValueDictionary()
with values for your action.Complete sample based on code from @Domenic in the comment below:
这是一个代码示例:
Here's a code example:
我知道我来晚了一点,但我使用了 veggerby 的解决方案并构建了一个可能对某些人有用的帮助器类,所以我想在这里提供它:
我提供了一个返回重定向的静态方法
ActionResult
和扩展filterContext
的扩展方法。 希望有人觉得这很有用。ObjectDictionary
是一个类,它使用反射根据构造它的对象的属性创建字典。 我没有包含该代码,因为我相信在框架中的某个地方有更好的方法来做到这一点。 我还没有发现,但我不想让别人继承我潜在的bug。I know that I'm a little bit late to the party, but I used veggerby's solution and built a helper class that may be useful to some people, so I wanted to provide it here:
I provided both a static method that returns a redirect
ActionResult
and an extension method that extendsfilterContext
. Hope someone finds this useful.ObjectDictionary
is a class that uses reflection to create a dictionary from the properties of the object from which it is constructed. I didn't include that code because I believe there is a better way to do that somewhere in the framework. I haven't found it yet, but I don't want others to inherit my potential bugs.安全/授权/身份验证筛选器应使用 AuthorizeAttribute 和 IAuthorizationFilter。
Security/Authorization/Authentication Filters should use the AuthorizeAttribute and IAuthorizationFilter.
用法:
filterContext.RedirectToAction("Login", "Account");
这是我编写的一个辅助类,其中包含一些扩展方法,旨在在更多地方提供 RedirectToAction 功能。 这对于OP来说已经太晚了,但希望它能帮助别人!
还有更多的 ControllerContext 未包含在内,但根据您的需要添加自己的 ControllerContext 应该相当容易。
Usage:
filterContext.RedirectToAction("Login", "Account");
Here's a helper class I wrote with some extension methods written to provide RedirectToAction functionality in more places. This is far too late for the OP but hopefully it helps someone!
There are more ControllerContexts that are not included but it should be fairly easy to add your own based on your needs.