我有一个Action Filter,它负责将一些常用信息放入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("无法对null引用执行运行时绑定")。
看起来即使我的操作筛选器在原始异常抛出之前成功地将值设置在ViewBag中,但在呈现我的Error.cshtml视图时仍然会使用一个空的ViewBag新上下文。
有没有办法让操作筛选器创建的数据可用于自定义错误视图?