如何在asp.net mvc中处理'查找未找到'InvalidOperationException?

Jay*_*ker 5 c# asp.net-mvc

我有一个asp.net mvc 1.0站点,它提供来自2级层次结构/类别/文章的一些内容

当事情正常工作时,文章会映射到视图并呈现视图.但是,当url符合路由条件但视图不存在时,会引发异常,我无法陷入Controller操作.

路由:

routes.MapRoute(
  "Article",
  "{category}/{article}.aspx",
  new { controller = "MyController", action = "Article" }
);
Run Code Online (Sandbox Code Playgroud)

MyController动作:

public ActionResult Article(string category, string article)
{
    string path = string.Format("~/Views/{0}/{1}.aspx", category, article);
    ViewResult vr = View(path);
    return vr;
}
Run Code Online (Sandbox Code Playgroud)

但是,当找不到视图时,System.InvalidOperationException会生成一个我无法在Controller Action中捕获的a.

异常详细信息:System.InvalidOperationException:找不到视图'〜/ Views/my-category/my-article-with-long-name.aspx'或其主文件.搜索了以下位置:〜/ Views/my-category/my-article-with-long-name.aspx

我可以在Application_Error()方法中捕获错误global.asax.cs但是:

  1. 不知道如何从那里重定向到错误视图
  2. 想知道是否有一个更接近异常的地方.

Jay*_*ker 7

xandy,Greg,我感谢你的回答.本文(aspnet mvc中基于资源的404错误的策略)帮助我以一种非常干净的方式推导出我正在寻找的解决方案.我需要做的就是覆盖Controller.OnException.由于我只有一个控制器,我需要行为,我只需要覆盖该控制器中的OnException.

话虽这么说,我的解决方案治疗的症状不是疾病,正如你们所建议的那样,最好在调用此方法之前检查文件是否存在.查看路径.

这是我用来治疗症状的代码:)

protected override void OnException(ExceptionContext filterContext)
{
    //InvalidOperationException is thrown if the path to the view
    // cannot be resolved by the viewengine
    if (filterContext.Exception is InvalidOperationException)
    {
        filterContext.ExceptionHandled = true;
        filterContext.Result = View("~/Views/Error/NotFound.aspx");
        filterContext.HttpContext.Response.StatusCode = 404;
    }

    base.OnException(filterContext);
}
Run Code Online (Sandbox Code Playgroud)

我无法解决的一个问题是如何以干净的方式显示NotFound视图.它通常通过ErrorController NotFound Action访问.我不得不硬编码它的路径.我可以忍受这个,但想知道是否有可能没有HC路径.