2017-02-11 2 views
2

작은 Asp.net 핵심 웹 API 프로젝트를 만들고 있습니다.Controller 메서드 매개 변수를 throw하는 생성자를 처리합니까?

public class Order 
{ 
    public readonly int Quantity; 

    public Order(int quantity) 
    { 
     if (quantity < 0) 
     { 
      throw new ArgumentException("quantity"); 
     } 
     this.Quantity = quantity; 
    } 
} 

과 같이 보입니다 컨트롤러 : 나는 긍정적 수량와 함께 Order 객체를 전달하면

[Route("api/[controller]")] 
public class OrderController : Controller 
{ 
    [HttpPost] 
    public IActionResult Post([FromBody]Order order) 
    { 
     // Do stuff... 
     return this.StatusCode(200); 
    } 
} 

에서, Post 방법이 제대로 작동 나는 모델이 보이는 개체가 있습니다. 그러나 Order을 음수로 전달하면 Order 생성자가 내 응용 프로그램이나 asp.net에서 처리하지 않은 예외를 throw합니다.

이 예외를 적절하게 처리하려면 어떻게해야합니까? 잘못된 문법 (예 : JSON이 잘못 작성된 경우)을 사용하여 요청을 전달하면 예외가 없으며 order 매개 변수의 값이 'null'임을 알 수 있습니다. 비슷한 일을 asp.net 설정할 수 있습니까? 아니면 throw하지 않도록 Order 생성자를 다시 작성해야합니까?

+0

빠른 google이 이것을 파헤 쳤습니다. https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling 어쩌면 먼저 문서를 살펴 봐야 할 것입니다 ... –

+1

"web api 모델 유효성 확인 ". 모델이 유효하지 않은 경우 오류가 아닌 400 BAD REQUEST 응답을 보내야합니다. 모델 검증에 예외를 사용하지 마십시오. – Amy

+0

@CallumLinington 개발자 예외 페이지를 표시하고 싶지 않거나 (반드시) 400을 반환하고 싶습니다. 인수를 null 또는 이와 유사한 것으로 설정하여 메서드를 실행하려고합니다. – Oliver

답변

4

DataAnnotation을 사용하면 MVC 방식을 수행하고 있습니다.

public class Order 
{ 
    [Range(1, Int32.MaxValue)] 
    public int Quantity { get; set; } 
} 

그런 다음 컨트롤러에서이 작업을 수행 : 당신이 이제까지 (전망)는 MVC 웹 응용 프로그램에서 Order 모델을 사용하기로 결정한 경우

[HttpPost] 
public IActionResult Post([FromBody]Order order) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
    } 

    // Do stuff... 
    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

다른 좋은면은, 당신은 클라이언트 측을 얻을 것이다 유효성 검사는 Range 속성 때문입니다.

+1

고마워, 나는 이것이 최선의 방법이라고 생각한다.모델이 비 MVC 코드와 공유 되었기 때문에 생성자로부터 예외를 유지하기를 바랬습니다. 그 패턴이 더 의미가있는 곳 이었지만 여기서 잘 맞지 않는다고 생각합니다. – Oliver

+1

다른 곳에서 API가 사용하는 모델 코드를 공유하는 것이 항상 이상적은 아닙니다. 일반적으로 ViewModel을 정의하여 API 와이어 형식을 정의하고이 ViewModel에서 모델 유효성 검사를 지정합니다. 그런 다음 유효하면 제어기 내부의 기본 모델 유형에 맵핑하십시오. – ssmith

+0

@ssmith MVC에서 "모델"이라는 단어를 사용하면 항상 도메인 모델이 아닌보기로 전달하는 것을 의미합니다. 어떤 사람들은 뷰 모델이라고 부르지 만 MVC에는 ViewModel이 없기 때문에 멀리 떨어져 있지만 mvvm에는 존재합니다. 어쨌든, 우리는 같은 페이지에 있습니다. – CodingYoshi