2010-05-06 2 views
1

Мне просто нужен небольшой CMS-подобный контроллер. Проще всего было бы что-то вроде этого:Возврат HTTP 404, когда вид MVC2 не существует

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, если нет зрения доступны?

Возможно, я могу проверить файлы в соответствующих местах и ​​кешировать результат, но это действительно грязно.

Thanks,
Dmitriy.

ответ

0

Ответ от Дарина Димитрова дал мне представление.

Я думаю, что было бы лучше, чтобы сделать именно это:

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

    } 
6
private bool ViewExists(string name) { 
    return ViewEngines.Engines.FindView(
     ControllerContext, name, "").View != null; 
} 
+0

Дарина, это красиво! Другое дело, чтобы рассмотреть здесь: уже есть экземпляр «ViewEngineResult», как можно его повторно использовать, чтобы «ViewResult» не выполнял поиск снова? –

+0

Не беспокойтесь об этом, когда скомпилированы в режиме просмотра режима просмотра, кешируются. –

+0

Также я считаю, что вид, найденный таким образом, должен быть правильно расположен. –