【问题标题】:How to pass objects between mvc controllers using TempData?如何使用 TempData 在 mvc 控制器之间传递对象?
【发布时间】:2016-01-10 02:41:18
【问题描述】:

当我的一个控制器中引发异常时,我会在我的基类中使用 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;
    }
}

【问题讨论】:

标签: c# asp.net-mvc


【解决方案1】:

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

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;
    }        
}

然后你应该在FilterConfigclass 中注册你的过滤器:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomExceptionHandlerAttribute());
    }
}

现在,当您的应用程序生成未处理的异常时,将针对此 ActionFilter 进行处理。

你的行动将是:

public ActionResult Test(string exceptionMessage)
{
    return View(exceptionMessage);
}

【讨论】:

  • 这是否会传递整个 Exception 对象,是否可以将其传递给不同于引发异常的控制器?
  • 我已经编辑了我的答案并修复了代码。是的,您可以传递给不同的控制器,但是为什么要传播 Exception 对象,Exception 过滤器的目的是处理异常,这意味着您应该在其中使用 Exception 对象执行逻辑。跨度>
  • @user3953989 有什么进展吗?
  • 我相信是这样,我认为这实际上是与我的 TempData 提供者有关。一旦我弄清楚了 100% 我会在这里更新
【解决方案2】:

您不需要将 Exception 保存在 viewData 中。当发生异常或错误时,只需将用户重定向到 Error 之类的客户视图并向用户显示错误,如下所示: 为您的模型设置以下模型:

@model System.Web.Mvc.HandleErrorInfo

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

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

Link

【讨论】:

  • 如何在单独的控制器上查看视图?
猜你喜欢
  • 2015-01-21
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多