ASP.NET Core MVC 모델 바인딩 사용 방법 및 원리

6231 단어 모델
전언
MVC의 모델 바인딩에 대해 조회해 봤는데 대부분이 어떻게 사용하는지, 그리고 모델 바인딩 과정에서의 사용법과 개념에 관한 것이었다. 모델 바인딩의 내부 메커니즘 실현에 관한 글이 드물기 때문에 본고는 ASP에 대해 설명하고자 한다.NET Core MVC에서 모델 바인딩이 어떻게 이루어졌는지, 그리고 그 밖의 몇 가지 용도가 있습니다.
모델 바인딩의 용도
일반적으로 우리는 MVC 프레임워크를 사용할 때 모델의 귀속과 관련된 기능을 주목할 필요가 없다. 왜냐하면 이것은 MVC 프레임워크 내부에 통합된 것이기 때문이다. 우리가 브라우저에서 주소를 방문할 때 GET든 POST든 Action에 비추는 과정에서 MVC 프레임워크는 자동으로 대상이나 루트 파라미터의 귀속을 진행했다.그중에 사용된 모델 귀속이다.
ASP에서.NET Core MVC에서 모델 바인딩은 단순 모델 바인딩과 복잡한 모델 바인딩으로 나뉜다.간단한 모델 귀속, 예를 들어Form 폼이나 URL 루트 데이터에서 정보를 직접 얻은 다음에Action 방법의 각 매개 변수에 응용한다. 복잡한 모델 귀속은 매개 변수의 값 위로 간단하게 전환되지 않을 수도 있고 중간에 일부 데이터 유형 전환, 모델 분해, 매개 변수 검사 등도 관련될 수 있다.
다음은 모델 바인딩의 예입니다.
Person이라는 ViewModel 객체가 있다고 가정해 봅니다. 이 객체의 코드는 다음과 같습니다.
public class Person{    public string Name { get; set; }    
    public int Age { get; set; }
}

이 ViewModel 객체에는 다음과 같은 간단한 유형이 사용됩니다.
public class PersonController{
    [HttpPost]
    [Route("~api/person/add")]    public IActionResult CreatePerson(Person person)    {        return Ok(person);
    }
}

위의 코드에서 우리는http://localhost:5000/api/person/add이 주소는 POST 요청을 보냅니다. Body 형식은 일반적인Form을 사용하고, 매개 변수는 위에서 Person이 정의한Name, Age를 사용합니다.Action에 인터럽트를 추가하면 개인 변수의 값을 볼 수 있으며, 이 Action은 json에 서열화된 결과 대상을 되돌려줍니다.
이러한 과정은 바로 모델이 실제 개발에 귀속된 용도와 용법이다.
쉬워 보이지 않나요?그러나 내부 모델에서 서브시스템을 연결하는 것은 비교적 복잡하고 많은 부분으로 구성된다.
모형 귀속의 일부 용법
ASP에서.NET Core MVC에서는 다음 양식 유형의 모델 바인딩을 지원합니다.
[FromHeader],[FromQuery],[FromRoute],[FromForm]
예:
public IActionResult CreatePerson([FromForm]Person person){    return Ok(person);
}

이러한 [FromXX] 는 해석하는 동안 모델이 HttpContext의 일부에서 정보를 얻도록 바인딩하는 것을 알려줍니다.
또한 모델 바인딩 프레임에 정의된 일부 Attribute는 모델 모델 과정에서 일부 매개변수를 제한하거나 무시하는 데 사용됩니다.예컨대
[BindRequired],[BindNever]
이 두 가지는 모델이 귀속되는 과정에서 추가되는 제약이다. BindRequired는 클래스나 속성에 적용될 수 있고 귀속 과정에서 필요한 값을 제한할 수 있다.BindNever는 현재 매개변수의 바인딩을 무시합니다.
[From Services], [From Body]가 두 개 더 있습니다.
[FromServices]는 매개변수가 바인딩되는 동안 DI 컨테이너에서 매개변수를 가져오는 모델 바인딩 프레임워크를 알려줍니다.
[FromBody]는 매개변수가 바인딩되는 동안 프레임에 구성된 포맷 프로그램을 사용하여 Http Body에서 매개변수가 해결되었음을 알려줍니다.
[From Body]에서는 기본적으로 MVC 프레임워크 내부에 설정된 Json Input Formatter를 사용하여 반서열화 해석을 할 수 있습니다. 만약에 전달된 Body의 유형이 응용 프로그램/xml이라면Configure 서비스 방법에서 서비스를 설정할 수 있습니다.AddMvc().AddXmlSerializerFormatters();XML을 반서열화합니다.
그리고 [Model Binder] 이것은 많은 사람들이 사용하지 않았을 수도 있습니다. 이것은 Controller의 속성에 적용되어 속성 정보를 연결하는 데 사용됩니다.예컨대
public class Controller{
    [ModelBinder]    public string Name { get; set;}    
    public IActionResult CreatePerson(Person person)    {        return Ok(person);
    }
}

Action이 활성화되면 Controller의 Name 속성에도 Action 매개 변수에 있는 개인 변수의 이름이 Name과 같은 매개 변수의 값이 있습니다.
사용자 정의 모델 바인딩
사용자 정의 모델 바인딩은 MVC 모델 바인딩에 속하는 일부 고급 지식으로 특수한 상황에서 사용할 수 있습니다.상세한 상황은 이 문장을 참고할 수 있다https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding본문은 너무 많이 소개할 생각은 없습니다.
MVC 모델 바인딩(ModelBinding) 구현 원리
내 ASP를 봤어.NET Core MVC Action이 이 글을 활성화한 학생들은 Action이 활성화되는 과정에서 여러 가지 상태가 관련된다는 것을 알아야 한다. 그러면 모델 귀속은 ActionBegin이라는 상태에서 진행되고 ActionNext 과정에서 사용되기 때문에 나는 이 문장의 Action 실행 부분에 따라 직접 설명을 했다.
우선, 모델이 연결된 입구는 Controller Action Invoker 클래스의 하나인Next 방법에 있습니다
private Task Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted){
    ......    
    switch (next)
    {        case State.ActionBegin:             BindArgumentsAsync();             goto case State.ActionNext;        
        case State.ActionNext:
            _actionExecutingContext = new ActionExecutingContext(_arguments);
    }
    
    ......
}

State에서 볼 수 있습니다.ActionBegin 프로세스에서 BindArgumentsAsync () 를 사용하여 매개변수를 바인딩하면 전체 바인딩 프로세스가 시작됩니다.
Core MVC 프레임워크 모델의 귀속 부분 원본에서 모델 귀속 원본은 메타데이터(Metadata), 값 공급기(Value Provider), 검증자(Validator), 귀속기(Binder)로 나뉜다.
메타데이터: 메타데이터는 모델 귀속 중의 실체 대상에 해당하고 전체 모델 귀속 서브시스템에 필요한 각종 필요한 정보와 메타데이터 정보를 저장하는데 모델 파라미터의 메타데이터와 귀속 정보의 메타데이터 등을 포함한다.
값 공급자: 값 공급자는 런타임 모델 바인딩에서 값을 추출할 수 있는 Provider를 제공합니다. 기본적으로 값 공급자는 다음과 같은 다양한 리소스의 값을 추출합니다.
1. 이전에 귀속된 조작 매개 변수(이 조작이 하위 조작일 때)
2. 양식 필드(FormValueProvider)
3. 라우팅 데이터(RouteValueProvider)
4. 쿼리 문자열 매개변수(QueryStringValueProvider)
5, JQuery 양식 데이터(JQueryFormValueProvider)
이 ValueProvider 대상들은CompositeValueProvider에서 통일적으로 관리합니다. 이 ValueProvider 대상을 만들거나 가져오는 데 사용되는 집합입니다.
검증자: 검증자는 Action 매개 변수의 모델 필드의 합법성을 검증하는 데 사용됩니다.
기본 구현은DefaultObjectValidator입니다. 메타데이터 정보에 따라 귀속 과정에서 사용되는 구체적인 ValudatorProvider 대상을 정합니다. ValudatorProvider는 IModelValidator 인터페이스의 실례 대상을 제공하는 데 사용됩니다.
ASP에서.NET Core MVC 중 두 종류가 IModelValidator 인터페이스를 실현했는데 이들은 Data Annotations ModelValidator와Validatable Object Adapter이다.그 중에서ValidatableObjectAdapter는 검증 결과를 변환하고 봉인하는 어댑터이기 때문에 DataAnnotationsModelValidator를 주로 봅니다.
DataAnnotations ModelValidator는 모델 클래스 중의 각종 Attribute를 검증하는 데 사용되는 것이다. 즉, DataAnnotations와 관련된 클래스, 예를 들어 [MaxLength], [Required], [RegularExpression] 등이다.
귀속기: 귀속기는 Action 매개 변수의 대부분 간단하고 복잡한 데이터 모델을 귀속시키는 데 사용되며, 모델의 각 속성에 대해 귀속 논리를 사용하여 이 목표를 실현한다.
서로 다른 유형의 바인딩에는 다음과 같은 바인딩기가 있습니다.
ArrayModelBinder,SimpleTypeModelBinder,FormFileModelBinder,FormCollectionModelBinder,ComplexTypeModelBinder,BodyModelBinder,HeaderModelBinder,DictionaryModelBinder,ServicesModelBinder,KeyValuePairModelBinder,ByteArrayModelBinder,CancellationTokenModelBinder,CollectionModelBinder,BinderTypeModelBinder
이러한 ModelBinder 객체에는 현재 Binder 객체의 인스턴스 객체를 반환하기 위한 각각의 Provider 객체가 있습니다.
이러한 ModelBinder 대상은 ParameterBinder가 통일적으로 관리하고 ParameterBinder 대상은 모델의 메타데이터 정보(Metadata), 귀속기 공장(BinderFactory), 검증자(Validator)를 받은 다음에 최종 모델 귀속 절차를 진행한다. 아래 그림은 다음과 같다.
전체 프로세스로 돌아가기
Controller Action Invoker로 돌아가서 Bind Arguments Core Async라는 함수에서 상위 모델을 바인딩합니다. 절차는 다음과 같습니다.
상기 총 절차의 첫 번째 단계는 MVC 코어 모델 귀속 시스템이 Controller에서 Action 파라미터를 귀속시키는 것이다. 실제로 Action 파라미터를 귀속시키는 것 외에 Controller에서 [Imodel Binder] 특성을 사용한 것을 귀속시킨다. 그러면 세 번째 단계는 바로 이 일을 하는 것이다.
이로써 모델 귀속 절차가 끝났습니다.
총결산
이 편에서 우리는 ASP에서 배웠다.NET Core MVC에서 모델 귀속의 일부 용도와 기본적인 용법을 배운 다음에 MVC 프레임워크에서 모델 귀속의 내부 실현 원리를 배웠다. 이를 통해 우리는 전체 모델 귀속 시스템에 대해 더욱 체계적인 이해를 하고 우리가 작업 시스템을 할 때 모델 귀속 시스템에 대한 확장을 할 수 있도록 한다.

좋은 웹페이지 즐겨찾기