如何使用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;
    }
}

如何使用TempData在mvc控制器之间传递对象

您应该创建自己的异常过滤器来处理错误

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

现在,您可以读取发生的错误并将其保存在数据库中,并向用户显示一条消息。

以下链接与您的问题类似:

链接