我正在使用 MVC3。
我想知道如果指定的视图不存在,是否可以呈现错误视图。
即如果“MyTableX”不存在:
RenderPartial("MyTableX");
将返回“Error.cshtml”作为部分视图,在页面中说“未找到部分视图”。
我正在使用 MVC3。
我想知道如果指定的视图不存在,是否可以呈现错误视图。
即如果“MyTableX”不存在:
RenderPartial("MyTableX");
将返回“Error.cshtml”作为部分视图,在页面中说“未找到部分视图”。
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
您可以基于此做一些事情 - 诀窍在于获取视图路径。缺少的视图会返回 InvalidOperationException。所以我们真的需要确定视图是否丢失或者它是否是由不同的东西引起的。一种方法是弄清楚如何在过滤器中获取 IView,将其转换为 RazorView 并从中获取路径 - 或者“hacky”方法是执行以下代码,但实际上寻找“视图”和异常消息中的“未找到”。我知道它很难看,但如果你想要今晚有用的东西,那就是我在睡觉前得到的所有东西,否则试着从那个过滤器中获取视图信息。
此链接中来自 Phil Haack 的这段代码可能有助于尝试获取路径名,快速测试导致我无法获取 IView,因为我的 filterContext.ParentActionViewContext 为空。 在 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;
}
}
}