1. Model State
모델 스테이트(Model State)= 모델 스테이트 딕셔너리

유효성 에러 표시 용도

혹은 이렇게 체크

if(ModelState.IsValid)

{

Employee employee =new

UpdateModel(employee);



EmployeeBusinessLayer employeeBusinessLayer

mployeeBusinessLayer.AddEmployee(employee);


return RedirectToAction("Index");

}

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

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

2. Validation 도우미 2개

1) Html.ValidationSummary() 도우미 

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

2) Html.ValidationMessage() 도우미

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


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

<%@ 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>


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


3. PreBinding / PostBinding


1) HTML 폼 필드들이 클래스에 바운드 되기 전에 에러를 주는 PreBinding 에러

2) HTML 폼 필드들이 바운드 된 후에 에러를 주는 PostBinding 에러

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

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

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

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









+ Recent posts