如何使用TempData在mvc控制器之间传递对象
本文关键字:之间 对象 控制器 mvc 何使用 TempData | 更新日期: 2023-09-27 18:29:50
当在我的一个控制器中抛出异常时,我在基类中用OnException捕获它,我想将异常对象传递给ErrorController的索引操作以显示在视图中。
在下面的例子中,我使用的是TempData,它在到达ErrorController之前就被丢弃了。
我知道TempData只会持续到下一个请求,但为什么它没有走那么远?
我也对解决这个问题的其他方法持开放态度。
测试控制器
public class TestController : BaseController
{
public ActionResult Index()
{
throw new Exception("test");
}
}
基本控制器
public class BaseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
return;
filterContext.ExceptionHandled = true;
// Redirect to a different controller than the one that threw the exception
filterContext.Result = RedirectToAction("Index", "Error");
filterContext.Controller.TempData["exception"] = filterContext.Exception;
}
}
您应该创建自己的异常过滤器来处理错误
public class CustomExceptionHandlerAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if(filterContext.ExceptionHandled)
return;
ConfigureResponse(filterContext);
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{"controller", Test},
{"action", Index},
{"exceptionMessage", filterContext.Exception.Message}
});
// log your error
base.OnException(filterContext);
}
private void ConfigureResponse(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
然后,您应该在FilterConfig
类中注册Filter:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomExceptionHandlerAttribute());
}
}
现在,当您的应用程序生成未处理的异常时,将对此ActionFilter进行处理。
你的行动将是:
public ActionResult Test(string exceptionMessage)
{
return View(exceptionMessage);
}
您不需要在viewData中保存Exception。当出现问题或错误时,只需将用户重定向到自定义视图(如Error
),并向用户显示错误,如下所示:为您的型号设置以下型号:
@model System.Web.Mvc.HandleErrorInfo
现在,您可以读取发生的错误并将其保存在数据库中,并向用户显示一条消息。
以下链接与您的问题类似:
链接