【问题标题】:Elmah and partial viewElmah 和局部视图
【发布时间】:2025-12-18 23:15:01
【问题描述】:

我有一个包含多个 div 的页面。对一个 div 的操作会更改其他 div 的内容。 每个 div 从控制器加载一个局部视图。例如 - “搜索”的 div 和“SearchResult”的另一个 div。 “搜索” div 包含几个字段和一个按钮。单击此按钮时,将使用 Ajax 异步调用控制器方法。此控制器方法可以返回“搜索结果”部分视图或引发异常。

在方法执行成功时,我的 Ajax 回调将使用控制器方法返回的部分视图数据更新“SearchResult”div 的内容。

对于所有未处理的异常,我使用 Elmah。基于上述设计,我希望 Elmah 记录错误并重定向到局部视图。我已经尝试过自定义错误,它适用于视图。一种选择是删除 Error.aspx 并设置 defaultHandler 以调用控制器的另一种方法(例如 MyCustomError),该方法可以将自定义错误作为部分视图返回。 如何在此“MyCustomError”方法或“MyCustomError”部分视图中获取原始异常详细信息?

编辑:对于 Elmah,我正在使用 Elmah 作者的解决方案 - How to get ELMAH to work with ASP.NET MVC [HandleError] attribute?

【问题讨论】:

  • 当您说“重定向到部分视图”时,您的意思是您将执行另一个 AJAX 请求以将“SearchResult” div 替换为您的部分视图的内容?

标签: .net asp.net-mvc partial-views elmah


【解决方案1】:

也许将异常作为模型传递给局部视图?

更新

public ActionResult DoSomething()
{

    try
    {
        ...
    } 
    catch(Exception e)
    {
        // send the error to Elmah
        ErrorSignal.FromCurrentContext().Raise(e);
        // pass it to the error display partial view.
        return View("ErrorDisplayControl",e);
    }

    return View();

}

如果您在主视图中使用RenderAction() 而不是RenderPartial(),则可以记录错误,然后返回正确的视图。

另外,您可能知道您应该向用户显示更友好的错误,而不是真正的异常消息。异常消息不仅会让用户感到困惑,而且向客户端提供这种原始数据也会带来一些安全问题。

【讨论】:

  • 问题是异常应该首先去Elmah所以它被记录下来。
  • 谢谢大卫,我目前有类似的代码,就像你上面给出的减去 ErrorSignal*** 行。如果您在上面看到我的编辑,我已经展示了我正在使用的 Elmah 解决方案。这有助于在代码中的任何地方简单地编写 HandleError 属性而不是 ErrorSignal***。但是您提供的解决方案以及我已经在我的应用程序中提供的解决方案与上述链接中提供的 HandleError 过滤器解决方案不太匹配
【解决方案2】:

TempData 属性适用于这类事情。您放入 TempData 的任何信息都将通过以下请求保留在那里。因此,如果您在错误发生时将错误信息放在那里,然后您的客户端代码向错误页面创建新的 ajax 请求,则错误控制器操作或部分视图可以从 TempData 检索错误信息。

【讨论】:

  • 通过“重定向到部分视图”我的意思是一旦 Elmah 记录了异常,我的自定义错误页面应该被返回。 web.config 中 customErrors 的 defaultRedirect 属性或 HandleError 属性的“View”参数行中的某些内容。就我而言,我希望返回部分视图。