如果找不到指定的视图,RenderPartial是否可能是默认值或错误?

时间:2013-03-07 23:46:26

标签: asp.net-mvc-3 razor asp.net-mvc-4

我正在使用MVC3。

我想知道是否可以呈现错误查看指定的视图是否不存在。

即如果“MyTableX”不存在:

RenderPartial("MyTableX");

将返回“Error.cshtml”作为部分视图,在页面中说“找不到部分视图”。

2 个答案:

答案 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;
            }
        }
    }