当前位置:  开发笔记 > 后端 > 正文

如何在AuthorizedAttribute中设置viewbag?

如何解决《如何在AuthorizedAttribute中设置viewbag?》经验,为你挑选了1个好方法。

我使用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);
    }

我尝试了如何为action过滤器在actionfilterattribute asp mvc 5中为viewbag设置值,并且它有效

任何帮助,将不胜感激。

编辑:

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

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



1> Shyju..:

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值将不可用。因此,如果要再次在视图中读取它,请再次设置它,或者最好使用视图模型,并将已读取的值设置为视图模型的属性值。

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有