ASP.NET MVC - Validation(1)



이번 포스팅은 유효성검사에 대해서 나눠보겠습니다.

유효성검사라 하면 필수입력값에는 꼭 데이터를 입력해야하고, 데이터의 타입이나 길이에 맞게 들어오게 체크하는 것을 말하겠죠?
자, 이번시간 ASP.NET MVC 가 알려주는 model state 와 validation 헬퍼 도우미에 대해서 알아보도록 하겠습니다.

Model State 알기

모델 스테이트(Model State)는  정확히는 모델 스테이트 딕셔너리라고 해서, 유효성 에러들을 표시하기위해 사용됩니다. 예를들어, 다음의 소스를 보면 데이터베이스의 TelDir을 Add 하기 전에 TelDir의 속성들의 유효성을 체크합니다.


유효성 검사중에 이 프로퍼티들에서 fail이 나면 model state dictionary(컨트롤러 클래스의 ModelState를 의미하는)에 추가가됩니다.

model state에 에러가 있으면 ModelState.IsVaild 는 false를 반환합니다. 이같은 경우, 전화번호를 추가하는 HTML 페이지는 다시 그려지게됩니다. 그렇지 않으면, 즉, 에러가 없을 경우는 디비에 저장이 됩니다.

Validation 도우미 사용하기

ASP.NET MVC 프레임워크는 두개의 validation 도우미를 제공합니다. Html.ValidationMessage() 도우미와 Html.ValidationSummary() 도우미죠.
이제 이 두 메쏘드를 사용하여 에러메시지를 표현하도록 하겠습니다.

이 두 메쏘드는 ASP.NET MVC 스카폴딩에 의해 자동적으로 Create와 Edit 뷰에서 사용이됩니다.

뷰를 생성해보죠. 뷰 생성은 너무많이 해보셔서 이제 지루하시죠?^^;
TelDir 모델을 강력하게 잡아서 뷰를 생성하도록 합니다.

먼저, Create() 액션에서 오른쪽 버튼을 클릭하여 Add View.. 를 클릭.
다음과 같이 하시면 Create 뷰가 생성이 되겠죠?


aspx 소스는 다음과 같고요.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Validation1.Models.TelDir>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Create
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Create</h2>
    <%= Html.ValidationSummary() %>
    <% using (Html.BeginForm()) {%>
        <fieldset>
            <legend>Fields</legend>
            <div class="editor-label">
                <%= Html.LabelFor(model => model.Name) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Name) %>
                <%= Html.ValidationMessageFor(model => model.Name) %>
            </div>
           
            <div class="editor-label">
                <%= Html.LabelFor(model => model.Phone) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Phone) %>
                <%= Html.ValidationMessageFor(model => model.Phone) %>
            </div>
           
            <div class="editor-label">
                <%= Html.LabelFor(model => model.SpeedDial) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.SpeedDial) %>
                <%= Html.ValidationMessageFor(model => model.SpeedDial) %>
            </div>
           
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    <% } %>
    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>
</asp:Content>

Id 부분은 제거를 했습니다. Id는 건들면 큰일나요~ ㅎㅎ

Html.ValidationSummary() 도우미는 HTML폼 위에서 바로 호출이 됩니다. 그리고선 불릿(bulleted) 리스트로 에러 메시지를 보여줍니다.

Html.ValidationMessage() 도우미는 각각의 HTML 폼 필드 옆에 호출이 됩니다. 에러를 해당 필드 바로 옆에 표시해주는거죠. 에러가 난 부분에도 같은 에러메시지가 표시되는 것을 확인할수 있습니다.

다음은 유효하지 않은 값을 summit 했을때의 화면입니다.


PreBinding? PostBinding?


에러 메시지를 주는 유효성 검사에는 두가지 타입이 있습니다. 그 중 하나는 HTML 폼 필드들이 클래스에 바운드 되기 전에 에러를 주는 PreBinding 에러가 있고, 다른 하나는 바운드 된 후에 에러를 주는 PostBinding 에러가 있습니다.

Create()  액션은 다음과 같이 TelDir 클래스의 인스턴스를 받도록 되어있습니다.

public ActionResult Create([Bind(Exclude="Id")] TelDir dir)

summit을 하게되면 모델 바인더에 의해 HTML 폼 필드들의 값이 dir 로 바운드됩니다. 폼 필드값을 바운드 하지 못하면 자동적으로 디폴트 모델 바인더에 에러 메시지를 추가합니다.

예를들어, 디폴트 모델 바인더는 TelDir 클래스의 SpeedDial 속성에 'speed' 문자를 바운드 할 수 없습니다. decimal 타입에 string 이라니. 말이 안되죠. 그래서, 모델 바인더는 모델 스테이트에 에러를 추가합니다. 저희가 유효성 검사를 하지 않은
필드도 검사를 하는거죠.


PreBinding 에러 메시지를 커스터마이즈 하고 싶다면, 그 메시지에 대한 문자열을 만들어서 할당하면 됩니다. (왜이리 말로 표현하는게 어려울까요? -_-;)

일단 이렇게 마무리를 짓겠습니다. 넘흐 피곤하네요 ㅎㅎ

참고 : http://www.asp.net/mvc/tutorials/performing-simple-validation-cs

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

ASP.NET MVC - Validation(3)  (0) 2010.05.26
ASP.NET MVC - Validation(2)  (0) 2010.05.25
ASP.NET MVC - Model(2)  (4) 2010.04.04
ASP.NET MVC - Model(1)  (0) 2010.03.31
ASP.NET MVC - View(4)  (0) 2009.12.11