【问题标题】:Can an attribute be made that can redirect to an action?可以制作一个可以重定向到动作的属性吗?
【发布时间】:2012-07-13 20:52:55
【问题描述】:

我有一个带有前端和后端的 MVC3 Web 应用程序。在后端,如果用户未登录(它检查会话),则每个操作都受到 if..then..else 重定向到另一个操作的保护。它在没有 Windows 角色的情况下执行此操作。

我想知道是否可以创建一个属性来执行检查并将用户重定向到登录页面,而不必在每个操作中一遍又一遍地插入相同的代码?

编辑#1

我创建了一个基本控制器,我的管理控制器从该控制器派生,并根据 Virus 所说的添加了以下成员:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        try
        {
            if (Session["loggedIn"] == null || (bool)Session["loggedIn"] != true)
            {
                TempData["targetAction"] = ControllerContext.ParentActionViewContext.RouteData.Values["action"] + "/" + ControllerContext.ParentActionViewContext.RouteData.Values["controller"];
                RedirectToRoute("Admin/Login");
            }
        }
        catch (NullReferenceException)
        {
            RedirectToRoute("Admin/Login");
        }
    }

但是这段代码不起作用。谁能告诉我怎么了?

【问题讨论】:

  • 只需将其包装为函数调用即可。
  • 你的属性会继承另一个属性吗?如果有,是哪个属性?例如,我使用自定义 AuthorizeAttribute 做到了这一点

标签: c# asp.net-mvc


【解决方案1】:

您可以轻松做到这一点。

不需要使用属性

只需创建一个继承自 Controller 类的通用 BaseController, 并从 BaseController 继承所有控制器

覆盖 BaseController 中的 OnActionExecuting 事件并将授权逻辑放在上面。

每次调用动作时都会执行 OnActionExecuting 事件。

如果您需要重定向到某个操作,此代码会有所帮助

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "Index" }, { "controller", "Account" } });

【讨论】:

  • 我已经在我的帖子末尾添加了一个编辑,其中包含我尝试按照你所说的代码,你能看看它并告诉我有什么问题吗?谢谢。
  • 问题是RedirectToRoute()是在请求结束后才执行的,这不是我们想要的。所以要立即重定向,我们可以使用 filterContext.Result 如答案所示。
【解决方案2】:

这就是内置的AuthorizeAttribute 过滤器的作用。

您可以在全局级别、控制器级别甚至操作级别使用AuthorizeAttribute 过滤器。如果内置的授权过滤器不足以满足您的需求,您可以通过继承它来轻松创建自定义过滤器,如post 中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 2011-01-25
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2015-07-29
    相关资源
    最近更新 更多