Kil*_*lea 0 error-handling asp.net-mvc action-filter asp.net-mvc-4
我使用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);
}
Run Code Online (Sandbox Code Playgroud)
控制者
[AllowAnonymous]
public ActionResult Oops()
{
var m = new Core.Models.ErrorModel();
var v = ViewBag.Issue; // == null
return View("~/Views/Error/Oops.cshtml", m);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了如何为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);
Run Code Online (Sandbox Code Playgroud)
现在,在Oops操作方法中,您可以读取设置的TempData值
public ActionResult Oops()
{
var issueDetails = TempData["Issue"];
// TO DO : Do something useful with issueDetails :)
return View();
}
Run Code Online (Sandbox Code Playgroud)
请记住,读取后,TempData值将不可用。因此,如果要再次在视图中读取它,请再次设置它,或者最好使用视图模型,并将已读取的值设置为视图模型的属性值。
| 归档时间: |
|
| 查看次数: |
2224 次 |
| 最近记录: |