3

내 서비스 클래스의 특정 예외를 처리하기 위해 사용자 지정 동작 필터를 사용하여 모델 상태를 채우고 뷰를 반환하고 싶습니다. 이 서비스를 부를 것이다, 기본적으로HandleError를 모델 상태 오류와 함께 사용하는 방법

public ActionResult SomeAction(SomeViewModel model) 
{ 
    try 
    { 
     _someService.SomeMethod(model); 
    } 
    catch (ServiceException ex) 
    { 
     ModelState.AddModelError(ex.Key, ex.ErrorMessage); 
    } 

    return View(); 
} 

을하고 ServiceException가 발생 된 경우, 그것은 문제가 있다는 것을 알고 w 모델 데이터/및 추가합니다 :

예를 들어, 내 앞의 코드를 가지고 ModelState에 오류가 발생하면 뷰를 반환합니다. 그러나 나는 모든 행동 방법에서이 같은 try/catch 코드를 사용했기 때문에 DRY와 유사한 패턴을 발견했습니다. 그래서 같은

public class HandleServiceErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     ((Controller)context.Controller) 
      .ModelState 
      .AddModelError(
       ((ServiceException)context.Exception).Key, 
       ((ServiceException)context.Exception).ErrorMessage 
      ); 
     context.ExceptionHandled = true; 
    } 
} 

그럼 간단하게 내 행동 방법 :

public ActionResult SomeAction(SomeViewModel model) 
{ 
    _someService.SomeMethod(model); 
    return View(); 
} 

문제가 동작하면,이다

그래서, 조금 그것을 건조, 나는 기본적으로 새로운 HandleServiceError 액션 필터를 생성 필터가 오류를 처리하면 내 작업 메서드로 돌아 가지 않습니다. 나는 일종의 후드 (후드)에서 이것이 왜 일어나는지를 이해합니다. 그러나 나는 아직도 내가하려는 일을하는 방법을 찾고 싶다.

이것이 가능합니까?

미리 감사드립니다.

UPDATE :

내가 그의 대답에 article Darin provided에서 제안을했지만, 컨트롤러의 모델 상태로 생성자 주입을 사용하려고 시도하는 문제 다 퉜다.

public ProductController() 
{ 
    _service = new ProductService(new ModelStateWrapper(this.ModelState), 
            new ProductRepository()); 
} 

: 당신이 그들의 컨트롤러 \ ProductController.cs 코드를 보면 예를 들어

, 그들은 그 시점에서 컨트롤러의 ModelState 전달, 서비스를 생성하기 위해 서비스 로케이터를 사용하여 컨트롤러의 빈 생성자가 당신이 주입 된 생성자를 보면, 그것은이 ModelState이 서비스를 생성자에 주입됩니다 가정

public ProductController(IProductService service) 
{ 
    _service = service; 
} 

내가 CI는 현재 컨트롤러의 ModelState와 함께 작동하도록하는 방법을 모르겠어요. 이것을 파악할 수 있다면이 방법이 효과적 일 수 있습니다.

context.Result = new ViewResult 
{ 
    ViewName = context.RouteData.GetRequiredString("action") 
}; 

당신은 또한 서비스 계층에서 유효성 검사를 수행하는 방법에 대한 대안에 대한 following article을 살펴 수 있습니다

답변

0

당신은 여전히 ​​해당 뷰를 반환 할 수 있습니다.

+1

감사합니다. 필자는이 기사에서 ModelStateWrapper를 사용하는 방법을 시도해 보았습니다. Unity IoC를 사용하면 고통 스러울 것입니다. 내 Controller.ModelState를 내 서비스 레이어에 삽입하는 방법을 알 수 없습니다. 생성자 삽입에서 서비스 로케이터로 이동하면이 작업을 수행 할 수 있지만 서비스 로케이터로 변경하지 않아도됩니다. 나는 보았고, 나는 이것에 대한 우아한 해결책을 찾지 못했다. (대부분은 해킹되거나 복잡해 보인다.) –

+0

나는 이것에 관한 더 많은 정보가있는 내 게시물을 업데이트했습니다. 생성자 삽입을 사용하여이 작업을 수행하는 방법이 있는지 궁금합니다. –

+0

아티클의 메서드를 사용하려면 모든 서비스 메서드의 true-ness를 수동으로 확인해야하며 "통과 또는 실패"와 같은 특정 오류 정보는 제공하지 않습니다. 또한 액션에서 여러 서비스를 호출하거나 하나의 서비스가 다른 서비스를 호출하는 경우 스택에서 진실을 확인해야합니다. Jerad의 독창적 인 방법은 시도 잡기가 필요한 반면 더 세련된 IMO입니다. –

관련 문제