2017-03-01 1 views
4

WebApi/MVC 응용 프로그램에서 별도의 모델 대신 여러 매개 변수를 사용해야 할 때 알려주시겠습니까?별도의 모델 대신 여러 매개 변수로 POST 메서드를 사용해야하는 경우?

몇 가지 매개 변수가 필요한 작업이 있습니다.

[HttpPost] 
public InfoViewModel GetInfo(IEnumerable<Guid> Ids, DocumentType type) 
{ 
    // to do smth 
} 

또한 나는 다음에이 작업을 변환 할 수 있습니다 :

[HttpPost] 
public InfoViewModel GetInfo(RequestViewModel model) 
{ 
    // to do smth 
} 

나는 두 번째 경우에 대한 특별한 모델이 필요합니다.

public class RequestViewModel 
{ 
    public IEnumerable<Guid> Ids { get; set; } 
    public DocumentType DocumentType { get; set; } 
} 

서버에 JSON 형식으로 데이터를 보냅니다. 이 두 가지 접근법의 장단점에 대해 말씀해 주시겠습니까? 감사.

+1

장점 중 하나는 당신이 더 많은 읽을 수있는 클래스에 매개 변수를 캡슐화하는 것입니다. GetInfo 메소드가 어떤 단계에서 추가 정보를 필요로하는 경우 ... 모델에 추가 필드를 추가하면 게시물의 서명이 변경되지 않습니다. – Wheels73

답변

3

ASP.NET 웹 API와 MVC는 아래와 같이 동작 메서드에 대한 매개 변수를 바인딩하려고 시도합니다.

  1. 복합 유형 매개 변수 (예를 들어, 사용자 정의 클래스) :
    • 웹 API - 기본적으로 요청 본문에서 바인드합니다. 그러나 이는 단 하나의 매개 변수, 즉 웹 API는 MediaTypeFormatter (간단히 말해서 Serializer)을 사용하여 요청 본문 JSON을 하나의 복합 유형 매개 변수에 바인딩합니다. 이는 요청 본문이 기본적으로 비 버퍼링 된 스트림에 저장되어 한 번 읽을 수 있기 때문입니다. 나머지 복합 유형 매개 변수 (있는 경우)는 매개 변수에 적용하여 바인딩 속성 (예 : [FromUri], [ModelBinder]) 중 하나를 사용하여 바인딩 할 수 있습니다.
    • MVC - 요청 본문, 경로/검색어 문자열 데이터가 모든 곳에서 바인딩됩니다. 이는 ModelBinder을 기본적으로 웹 사이트에서 사용하는 MediaTypeFormatter과 비교하여 사용하기 때문입니다.
  2. 간단한 유형 매개 변수 (예를 들어, 원시 형, 문자열 등) :
    • 웹 API는 - 중 항로/쿼리 문자열 데이터 즉로부터 URI에서 기본적으로 바인딩합니다. 그러나 [FromBody] 속성 또는 일부 유형 변환기를 매개 변수에 적용하여 강제로 본문에서 바인딩 할 수 있습니다.
    • MVC - 요청 본문, 경로/검색어 문자열 데이터가 모든 곳에서 바인딩됩니다. 이는 기본적으로 ModelBinder을 사용하기 때문입니다.
    • 로 돌아 가기 귀하의 질문에

,

  1. 웹 API - (요청 본문에 데이터를 전송됩니다 POST 요청을 가정하고 DocumentType는 클래스이며 구속력 속성이 적용되지 않습니다 to) 접근법 2 만 제대로 모델을 바인딩하지만 접근법 1은 모두 복합 유형 매개 변수이며 어떤 O에 바인딩 속성도 적용되지 않으므로 네.
  2. MVC - 둘 다 정상적으로 작동하지만 접근 방식 2은 미래에 추가 속성을 추가하는 데있어 가독성과 확장 성이 훨씬 뛰어납니다.

상세 정보 :

관련 문제