You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向控制器传递数据?全局异常处理中如何传异常到错误视图?

问题解答

问题1:是否存在向控制器传递数据的方法?

当然有,常见的实现方式包括:

  • 路由参数:在URL路径中定义参数,控制器Action通过同名参数接收。比如Action定义public IActionResult Detail(int id),对应请求URL /Product/Detail/1,框架会自动将id绑定为1。
  • 查询字符串:通过URL末尾的键值对传递数据,比如/Product/Detail?id=1&category=electronics,Action可直接通过同名参数接收,或用Request.Query["id"]手动读取。
  • 请求体数据:POST请求时,通过表单或JSON传递复杂结构数据。表单提交可直接绑定到模型:[HttpPost] public IActionResult Create(Product model);JSON数据需添加[FromBody]特性:[HttpPost] public IActionResult Create([FromBody] Product model)。
  • TempData:用于跨请求传递临时数据(比如重定向场景),数据存储在会话中,默认一次请求后过期。示例:TempData["Tip"] = "操作完成";,后续Action可通过TempData["Tip"]读取。
  • Session:长期保存用户会话级数据,需先启用Session功能。示例:HttpContext.Session.SetString("UserName", "admin");,读取时用HttpContext.Session.GetString("UserName");。
  • 依赖注入:若数据来自服务层,可通过构造函数注入服务类,从服务中获取数据。

问题2:全局异常处理中重定向到错误Action并传递异常信息到视图

你当前使用context.Response.Redirect属于客户端跳转,默认会丢失当前请求的上下文数据,可通过TempData实现跨请求传递异常信息,具体步骤如下:

1. 中间件中存入异常信息到TempData

修改HandleExceptionAsync方法,通过ITempDataDictionaryFactory获取TempData实例,将异常的关键信息存入(建议只传递需要展示的字段,避免敏感信息泄露):

private static async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
    // 获取TempData工厂实例
    var tempDataFactory = context.RequestServices.GetService<ITempDataDictionaryFactory>();
    var tempData = tempDataFactory.GetTempData(context);

    // 存入异常核心信息
    tempData["ErrorMessage"] = exception.Message;
    tempData["ErrorStackTrace"] = exception.StackTrace;

    // 重定向到错误页
    context.Response.Redirect("/Account/Error");
}

2. 错误Action读取TempData并传递给视图

在AccountController中实现Error Action,读取TempData中的数据并封装为视图模型:

public IActionResult Error()
{
    var errorModel = new ErrorViewModel
    {
        Message = TempData["ErrorMessage"] as string ?? "未知错误",
        StackTrace = TempData["ErrorStackTrace"] as string
    };

    return View(errorModel);
}

3. 视图展示错误信息

创建对应的Error.cshtml视图(路径:Views/Account/Error.cshtml),接收模型并展示内容:

@model ErrorViewModel

<h1>系统错误</h1>
<div class="error-message">@Model.Message</div>
@if (!string.IsNullOrEmpty(Model.StackTrace))
{
    <details class="error-details">
        <summary>查看详细堆栈</summary>
        <pre>@Model.StackTrace</pre>
    </details>
}

补充说明

  • 若需传递完整Exception对象,需确保该对象可序列化(自定义异常类可标记[Serializable]特性),但更推荐只传递必要的展示字段,降低安全风险。
  • ASP.NET Core项目默认已启用TempData功能,依赖会话状态,无需额外配置。

内容的提问来源于stack exchange,提问作者user19577618

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:30:47