I just need to have the a small CMS-like controller. The easiest way would be something like this:
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? } }
The question is how to return HTTP 404 if the there is no view available?
Probably I can check the files in appropriate locations and cache the result, but that feels really dirty.
Thanks,
Dmitriy.
2010-05-06 10:56:38Z
1:
private bool ViewExists(string name) { return ViewEngines.Engines.FindView( ControllerContext, name, "").View != null; }
2:
The answer from Darin Dimitrov got me an idea.
I think it would be best to do just this:
public class HomeController : Controller { public ActionResult View(string name) { return new ViewResultWithHttpNotFound { ViewName = name}; } }
having a new type of action result:
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; } }