埃尔玛和部分观点

时间:2010-09-21 10:40:46

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

可能将异常作为模型传递给局部视图?

<强>更新

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()将其包含在主视图中,则可以记录错误,然后返回正确的视图。

此外,您可能已经意识到应该向用户呈现更友好的错误,而不是真正的异常消息。异常消息不仅会使用户感到困惑,而且向客户端提供这种原始数据会引入一些安全问题。

答案 1 :(得分:1)

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