2010-05-06 2 views
1

작은 CMS와 같은 컨트롤러 만 있으면됩니다. 가장 쉬운 방법은 다음과 같습니다.MVC2보기가 존재하지 않을 때 HTTP 404가 반환됩니다.

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.

답변

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

또한이 방법으로 발견 된 견해가 적절히 처리되어야한다고 생각합니다. –

관련 문제