我正在使用MVC3。
我想知道是否可以呈现错误查看指定的视图是否不存在。
即如果“MyTableX”不存在:
RenderPartial("MyTableX");
将返回“Error.cshtml”作为部分视图,在页面中说“找不到部分视图”。
答案 0 :(得分:1)
MVC有一个名为[HandleError]的属性,您应该在BaseController(或每个控制器)上设置该属性。无需为属性指定任何选项。
[HandleError]的问题是它无法处理404(未找到),因此我们需要创建一个自定义错误控制器并告诉ASP.NET使用它(通过配置web.config和创建和ErrorController) :
http://blog.gauffin.org/2011/11/how-to-handle-errors-in-asp-net-mvc/#.UTknoxyfjmA
答案 1 :(得分:0)
你可以基于此做一些事情 - 诀窍在于获取视图路径。 缺少的视图返回InvalidOperationException。因此,我们确实需要确定视图是否缺失,或者是否由不同的视图引起。一种方法是弄清楚如何在过滤器中获取IView,将其转换为RazorView并从中获取路径 - 或者“hacky”方式是执行以下代码,但实际上是查找“视图”和异常消息中“未找到”。我知道它很难看,但是如果你想要一些今晚有用的东西,那就是我在睡觉前得到的所有东西,否则试着从那个过滤器中获取视图信息。
此链接中的Phil Haack的代码可能有助于尝试获取路径名称,快速测试得出我无法获得IView,因为我的filterContext.ParentActionViewContext为null。 Retrieve the current view name in ASP.NET MVC?
所以我写了这个基本的,但是,任何抛出InvalidOperationException的东西都会导致这个。
另请注意,缺少“MissingView.cshtml”可能会导致无限循环(未经测试的假设)
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class ViewCheckFilterAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
var exception = filterContext.Exception;
if (exception is System.InvalidOperationException)
{
//ideally here we check to ensure view doesn't exist as opposed
//to something else raising this exception
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/MissingView.cshtml"
};
filterContext.ExceptionHandled = true;
}
}
}