[ASP.NET MVC] Custom Validation Message

2014. 3. 19. 20:58WEB

ASP.NET MVC에서 대부분의 Validation Message는 Validation Attribute를 통해 사용자가 수정할 수 있습니다.

[Range(0, 200, ErrorMessage="유효한 나이를 입력해주세요.")]
public int? Age { get; set; }

모든 Default Validation Message는 ASP.NET MVC Framework 내부의 Resource 파일에 영어로 저장되어 있습니다. 따라서 아래와 같이 Validation Attribute를 통해서 지정할 수 없는 경우에는 영어로 출력되는 메시지를 볼 수 밖에 없습니다.

이처럼 FormatException 등에 대해서는 Validation Attribute를 제공하지 않기 때문에 다른 방법을 사용해야 합니다. ASP.NET MVC에서는 이러한 경우를 위해 Custom Validation Message를 재정의 하는 방법을 제공합니다.

MVC Framework 소스코드를 뒤져보면 아래 그림과 같이 System.Web.Mvc에 Resources/MvcResources.resx폴더에 오류 메시지를 저장해두고 이놈을 DefaultModelBinder가 불러다 쓰고 있음을 알 수 있습니다.

다행이도 사용자가 이 Reource 파일을 재정의할 수 있는 방법을 제공하고 있습니다. 다음과 같은 방법을 통해 오류 메시지를 재정의할 수 있습니다.

  1. Project에 App_GlobalResources 폴더를 추가합니다.
  2. Resource 파일을 추가합니다.
  3. Resource 파일을 열고 다음과 같이 'PropertyValueInvalid', 'PropertyValueRequired' 등 재정의할 Name을 추가하고 Value값을 입력해줍니다.
  4. Global.asax의 Application_Start Event에 다음과 같이 Resource 파일을 재정의 해줍니다.
    DefaultModelBinder.ResourceClassKey = "MvcResources";

그리고 다시 컴파일 하시면 아래와 같이 조정된 메시지가 나타나게 됩니다.

여기서는 MVC 4.0을 기준으로 작업하였는데요, 구 버전에서는 약간 다를 수 있으니 참고바랍니다.

그리고 한가지 더 추가하자면, 위와 같이 ResourceClassKey를 추가하시면 DefaultModelBinder는 다음과 같은 순서로 Resource를 검색하여 사용하게 됩니다.

  1. ResourceClassKey가 지정되지 않았으면 MVC Framework 기본 Resource를 이용합니다.
  2. ResourceClassKey가 지정되었으면 해당 파일을 검색하여 사용하며, 유효하지 않은 ResourceClassKey가 지정되었으면 Exception을 발생시킵니다.
  3. ResourceClassKey에 지정한 Resource를 찾으면 필요한 Resource Name을 검색하여 사용합니다. 만약 찾지 못하면 MVC Framework 기본 Resource에서 다시 검색하여 사용합니다.