【发布时间】: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