代码之家  ›  专栏  ›  技术社区  ›  Dmytrii Nagirniak

MVC2视图不存在时返回HTTP 404

  •  1
  • Dmytrii Nagirniak  · 技术社区  · 14 年前

    我只需要有一个像CMS一样的小控制器。最简单的方法是这样:

    public class HomeController : Controller {
        public ActionResult View(string name) {
            if (!ViewExists(name))
                return new HttpNotFoundResult();
            return View(name);
        }
    
        private bool ViewExists(string name) {
            // How to check if the view exists without checking the file itself?
        }
    }
    

    问题是如果没有可用的视图,如何返回http 404?

    也许我可以在适当的位置检查文件并缓存结果,但那感觉真的很脏。

    谢谢,
    Dmitriy。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Darin Dimitrov    14 年前
    private bool ViewExists(string name) {
        return ViewEngines.Engines.FindView(
            ControllerContext, name, "").View != null;
    }
    
        2
  •  0
  •   Dmytrii Nagirniak    14 年前

    达林·迪米特洛夫的回答给了我一个主意。

    我认为最好这样做:

    public class HomeController : Controller {
        public ActionResult View(string name) {
            return new ViewResultWithHttpNotFound { ViewName = name};
        }
    }
    

    产生一种新的作用结果:

        public class ViewResultWithHttpNotFound : ViewResult {
    
            protected override ViewEngineResult FindView(ControllerContext context) {
                ViewEngineResult result = ViewEngineCollection.FindView(context, ViewName, MasterName);
                if (result.View == null)
                    throw new HttpException(404, "Not Found");
                return result;      
            }
    
        }