我有一个动作过滤器,负责将一些通用信息放入 ViewBag 中,以供共享 _Layout.cshtml 文件中的所有视图使用。
public class ProductInfoFilterAttribute : ActionFilterAttribute
{
public override void
OnActionExecuting(ActionExecutingContext filterContext)
{
// build product info
// ... (code omitted)
dynamic viewBag = filterContext.Controller.ViewBag;
viewBag.ProductInfo = info;
}
}
在共享的 _Layout.cshtml 文件中,我使用了已放入 ViewBag 的信息。
...
@ViewBag.ProductInfo.Name
...
如果在处理控制器操作时发生异常,标准的 HandleErrorAttribute 应该显示我共享的 Error.cshtml 视图,这在我引入上面的操作过滤器并开始使用 _Layout.cshtml 中的 ViewBag 的新值之前有效。现在我得到的是标准的 ASP.Net 运行时错误页面,而不是我的自定义 Error.cshtml 视图。
我已经追踪到这样一个事实,即在呈现错误视图时,在 _Layout.cshtml 中使用 ViewBag.ProductInfo.Name 时会引发 RuntimeBinderException(“无法对空引用执行运行时绑定”)。
看来,即使我的操作过滤器在引发原始异常之前已成功设置 ViewBag 中的值,在呈现我的 Error.cshtml 视图时仍会使用具有空 ViewBag 的新上下文。
有什么方法可以让操作过滤器创建的数据可用于自定义错误视图?