2009-03-23 4 views
1

개발중인 응용 프로그램의 필터 중 하나는 사용자가 변경하려는 항목을 소유하고 있는지 확인합니다. 액션은 [RequiresOwnership] 속성으로 꾸며졌으며 속성 로직 내부에서 사용자가 아이템을 소유하고 있는지 확인하고 그렇지 않은 경우 UnauthorizedAccessException을 던집니다..NET의 MVC에서 필터에 의해 throw 된 예외를 잡는 방법?

내 질문은 : 어디에서 예외를 잡을 수 있습니까? 예외 페이지를 표시하는 대신 사용자가 시도한 내용이 허용되지 않는 이유를 설명하는 페이지로 사용자를 리디렉션하는 것이 이상적입니다. 나는 속성에 의해 장식 된 액션 내부에서 예외를 잡아낼 것이라고 생각하지 않는다. 그래서 .NET MVC 모델에서 예외를 처리 할 수있는 애플리케이션의 기본 부분이 있는가?

편집 : 필터 자체를 통해 페이지로 리디렉션 할 수 있다는 것을 알았지 만 이는 나에게 약간의 해커처럼 보입니다. 속성을 통해 예외를 던져서 잡을 수 있고 처리 할 수있는 표준 장소를 하나 마련하는 것이 좋습니다.

답변

2

컨트롤러에서 [HandleError] 특성이 필요하다고 생각합니다.이 특성은 오류 처리기보기에 선택적 경로를 사용합니다. 기본값은 ~/Views/Shared/Error.aspx입니다. 특정 예외에 대한 추가 지원을 추가 할 수 있습니다.

0

이 문제가 발생했습니다.이를 해결하기 위해 FilterContext의 TempData 컬렉션에 던져 넣지 않고 예외를 추가했습니다. 그런 다음 당신의 행동 방식에서 확인할 수 있습니다, 그것을 재 - 던져 적절하게 처리 :

을 속성에서 :

if (/*some error condition*/) 
    filterContext.Controller.TempData["Err"] = new Exception("An error"); 

및 작업 방법에 :

var e = TempData["Err"] as Exception; 
if (e != null) 
    throw e; 

그것은이다 덜 이상적인 솔루션이지만 언급 한 것처럼 속성에서 예외를 잡을만한 유용한 곳은 없습니다.

+0

* "특성에서 예외를 찾아내는 데는 유용한 곳이 없습니다."* @ GalacticCowboy의 답변에 어떤 문제가 있습니까? – seebiscuit

관련 문제