ASP.NET MVC - Validation(4)

Posted by 미나빠!
2010.05.27 09:00 .NET/MVC Basic

이제야 현실을 깨닫고 정신차리기 시작한 쎄스 인사올립니다^^ (하지만, 언제 다시 나사가 풀릴지는...헤헤)

Data Annotation과 함께하는 유효성 검사

이번에는 유효성검사에 데이타 어노테이션 밸리데이터(이하, DAV)를 사용해보겠습니다.
DAV는 Required 나 StringLength 같은 몇 속성만 추가하여 간단하게 유효성검사를 수행합니다.

DAV 속성 사용하기

데이터 어노테이션 모델 바인더는는 밸리데이터 속성으로 유효성을 검사합니다. System.ComponentModel.DataAnnotations 네임스페이스는 다음의 밸리데이터 속성을 포함합니다.

Range - 값의 범위를 나타내는거죠.
RegularExpression - 정규식에 매치가 되는지 확인하는것이고요.
Required - 필수값이죠!
StringLength - 문자열의 맥스값을 나타냅니다.
Validation - 모든 밸리데이터 속성의 기본 클래스입니다.

표준 밸리데이터를 만족하지 못하는 유효성을 검사하고 싶다면, 커스텀 밸리데이터 속성을 만들수 있습니다.
추후에 같이 해보시죠.

서론이 길다. 예제를 보여줘봐.

TelDir 클래스에 밸리데이션 속성을 추가해봅시다.
필수값 체크 속성도 넣어보고, 맥스렝쓰도 넣어보고, ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace Validation2.Models
{
    public class TelDir
    {
        public int Id { get; set; }
       
        [Required]
        [StringLength(10)]
        public string Name { get; set; }

        [Required]
        public string Phone { get; set; }
       
        [DisplayName("Speed Dial")]
        [Range(1,99)]
        public decimal SpeedDial { get; set; }
    }
}


DisplayName 속성이 눈에 띄는데요. "어 저거는 아까 설명한것에 없는거잖아? 제대로 설명안할래!!!" 라고 물으신다면;;;
그냥 조용히 식은땀만 흘리도록 하죠^^;
DisplayName 이거슨 머시냐? 바로 에러메시지를 출력할때, 해당이름으로 표현주겠다는 의미입니다.
"The Speed Dial field is required"

하지만 대부분의 메시지는 정말 커스텀하게 설정을 하는것이기에, 저렇게는 안쓰겠죠?
내가 원하는 메시지를 주고싶은데?! 라고 생각되시면 이렇게 하시면 됩니다.
[Required(ErrorMessage="야 이거 필수값이야!!!")]

Create() 컨트롤러 액션에서 위의 TelDir클래스를 사용할수 있습니다. model state에 에러가 있다면, Create 뷰페이지를
다시 보여주죠.

public ActionResult Create()
{
    return View();
}

[HttpPost]
public ActionResult Create([Bind(Exclude = "Id")] TelDir dir)
{
    if (!ModelState.IsValid)
        return View();
    return RedirectToAction("Index");
}


Create 뷰페이지를 생성하겠습니다. 강력한 뷰를 만들고 View data class 는 TelDir 클래스를 선택합니다.
아참, 하시기 전에 빌드하는 거 잊지마시고요. 빌드안하면 모델 클래스를 선택할수 없습니다.
생성된 뷰페이지에서 Id 필드는 제거합니다. 이거 Identity 한건데 사용자가 건들면 곤란해지겠죠?

자~ 이제 뷰도 생겼겠다, 바로 실행해보죠. submit을 날리게 되면... 다음과 같은 붉은색의 에러가 보이죠.


값을 넣는데 원하는 값을 주지 않게 되면 역시나 다음과 같은 에러가 보이게 되는거죠.


엔티티 프레임워크+DAV 사용

자~ 엔티티 프레임워크에 대한 설명은 필요없고, 이 놈이 모델 클래스를 생성한다는 것만 알면 됩니다. (정말? 이라 물으신다면. 또 식음땀만 흘릴 따름이죠;;)
엔티티 프레임워크로 생성된 이 모델 클래스는 우리가 직접적으로 터치 할수 없습니다.ㅠㅠ

그럼 유효성 검사부분을 어디서 해야한단 말인거냐?

meta data 클래스를 만들어야 합니다. 이 모델에 대한 partial 클래스도 만들어야하고요.
다음 소스를 보시죠.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace Validation2.Models
{
    [MetadataType(typeof(TelDirMetaData))]
    public partial class TelDir
    {
    }

    public class TelDirMetaData
    {       
        [Required]
        [StringLength(10)]
        public object Name { get; set; }

        [Required]
        public object Phone { get; set; }
       
        [DisplayName("Speed Dial")]
        [Range(1,99)]
        public object SpeedDial { get; set; }
    }
}


위 소스를 보시면, 두개의 클래스가 존재합니다. TelDir과 TelDirMetaData.
TelDir클래스는 파샬클래스입니다. 이는 엔티티 프레임워크로 생성된 클래스와 대응이 됩니다.

현재, 닷넷 프레임워크는 파샬 프로퍼티를 지원하지 않습니다. 그래서 DataModel.Designer.cs파일에 정의된 속성들에 위 파샬클래스의 있는 밸리데이터 속성들을 적용시킬 방법이 없습니다.

TelDirMetaData 클래스를 가리키는 MetadataType 속성을 TelDir 파샬클래스에 추가합니다. TelDirMetaData 클래스는  TelDir클래스의 프록시 속성을 포함합니다.

프록시 속성은 TelDir 클래스의 속성들의 타입과 같을 필요가 없습니다. 예를들어, TelDir 클래스의 Name 은 string 이지만, TelDirMetaData 클래스에서는 object 입니다.

이번 시간은 Data Annotation에 대해서 알아봤는데요. 이번 시간으로 유효성 검사 부분은 마치겠습니다.
이제 뭐할까요?^^

참고 : http://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-cs

신고

'.NET > MVC Basic' 카테고리의 다른 글

ASP.NET MVC - Validation(4)  (0) 2010.05.27
ASP.NET MVC - Validation(3)  (0) 2010.05.26
ASP.NET MVC - Validation(2)  (0) 2010.05.25
ASP.NET MVC - Validation(1)  (0) 2010.05.24
ASP.NET MVC - Model(2)  (4) 2010.04.04
ASP.NET MVC - Model(1)  (0) 2010.03.31
이 댓글을 비밀 댓글로