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