【问题标题】:How to set viewbag in AuthorizedAttribute?如何在 AuthorizeAttribute 中设置 viewbag?
【发布时间】:2015-12-13 21:04:18
【问题描述】:

我使用 MVC 4 并将一些逻辑移动到授权过滤器中。 我正在尝试重定向到基于未授权的错误页面。我想设置最后一页路由和其他一些属性来捕获错误。

下面是我的覆盖

        //  handle unauthorized
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Controller.ViewBag.LastRoute = filterContext.RouteData;
        filterContext.Controller.ViewBag.Issue = "put...val here";

        var routeValues = new RouteValueDictionary(new
        {
            controller = "Error",
            action = "Oops"
        });

        filterContext.Result = new RedirectToRouteResult(routeValues);
    }

控制器

        [AllowAnonymous]
    public ActionResult Oops()
    {
        var m = new Core.Models.ErrorModel();

        var v = ViewBag.Issue;  // == null

        return View("~/Views/Error/Oops.cshtml", m);
    }

我尝试了how to set values to viewbag in actionfilterattribute asp mvc 5 的动作过滤器,它有效

任何帮助将不胜感激。

编辑:

抱歉,当我到达控制器时,以下值: ViewBag.Issue = null。

我不知道如何设置属性并让它保持值。

【问题讨论】:

  • 从您的帖子中不清楚什么不起作用或您的问题到底是什么。
  • 您将结果设置为重定向用户,因此永远不会调用原始的目标操作。相反,浏览器最终会向 Error/Oops 端点发出另一个请求,因此届时您将处于一个带有单独 ViewBag 的新请求中。考虑使用 TempData 使信息可用于下一个请求,或考虑直接从您的操作过滤器返回 View() 结果(将用户留在原始操作上,但向他们显示一个看起来像 Oops 操作的页面)。跨度>

标签: asp.net-mvc asp.net-mvc-4 error-handling action-filter


【解决方案1】:

RedirectToRouteResult 将向浏览器发送重定向响应,并且浏览器将向指定的 url 发出全新的 GET 请求。 ViewBag 数据不会在 2 个 http 请求之间存在。

您可以使用 TempData 将数据保存在 2 个单独的 http 请求之间。您可以在一个操作方法中设置您的 TempData 值,并且在此之后调用的任何操作方法都可以从 TempData 对象获取值然后使用它。 TempData 在后台使用 Session 来存储数据。 TempData 的值会一直存在,直到它被读取或会话超时。这对于重定向等场景非常理想,因为 TempData 中的值在单个请求之外可用。

因此,在您的操作过滤器中,您可以设置 TempData 字典而不是 ViewBag。

filterContext.Controller.TempData["Issue"] = "Robots are laughing non stop";

var routeValues = new RouteValueDictionary(new
{
    controller = "Home",
    action = "Oops"
});

filterContext.Result = new RedirectToRouteResult(routeValues);

现在在您的 Oops 操作方法中,您可以读取您设置的 TempData 值

public ActionResult Oops()
{
  var issueDetails = TempData["Issue"];
  // TO DO : Do something useful with issueDetails :)
  return View();
}

请记住,TempData 值在您阅读后将不可用。因此,如果您想再次在视图中读取它,请再次设置它或更好地使用视图模型并将已经读取的值设置为视图模型的属性值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多