如何在AuthorizedAttribute中设置viewbag?

时间:2015-12-13 21:04:18

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

我使用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。

我不确定如何设置属性并保持其值。

1 个答案:

答案 0 :(得分:4)

RedirectToRouteResult将向浏览器发送重定向响应,浏览器将向指定的网址发出全新的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值将无法使用。因此,如果您想再次在视图中阅读它,请再次设置或更好地使用视图模型并将已读取的值设置为视图模型的属性值。