Programming/.NET
ASP.NET 에서 제공하는 여러 유효성검사 컨트롤중 딱히 쓸만한 것이 없다고 판단되면 그냥 개발자 임의로 유효성검사로직을 정할 수 있고 그 로직을 적용하도록 하는 것이 바로 CustomerValidator 컨트롤입니다.

 클라이언트 유효성 검사

CustomerValidator 의 유효성검사는 클라이언트측의 자바스크립트(javascript) 등을 이용해 수행할 수 있습니다. 이를 위해 우선 다음과 같이 유효성검사를 수행할 임의의 스크립트를 작성하고
<script type="text/javascript">
    var input_check = function (oSrc, args) {
        if (args.Value != '땡칠이') {
            args.IsValid = false;
        }
    }
</script>
페이지에 CustomValidator 컨트롤을 배치하여 위에서 작성한 스크립트 함수명을 ClientValidationFunction 속성에 지정합니다.
영구와 : <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="반드시 '땡칠이'여야 합니다." ControlToValidate="TextBox1" ClientValidationFunction="input_check"></asp:CustomValidator>
위 예제는 TextBox1 에 입력한 내용을 확인하고 '땡칠이'가 아니면 오류메세지를 표시하도록 하였습니다.

사용자가 TextBox에 어떤 내용을 입력하고 처리를 수행하려고 하면 우선 지정한 input_check 함수를 호출하게 되는데 입력내용을 args 파라메터의 Value 로 확인하고 만약 원하는 내용이 아닌경우 IsValid 속성을 false로 하여 유효성확인을 통과하지 못하도록 설정합니다.

혹시 경우에 따라 클라이언트측의 유효성검사가 수행되지 않아야 한다면 EnableClientScript 속성의 값을 false로 지정하면 됩니다. 해당 속성은 CustomerValidator 컨트롤 뿐만 아니라 다른 유효성검사 컨트롤에도 존재하는 속성이며 EnableClientScript 가 false로 지정되면 해당 유효성검사는 서버측에서 수행됩니다.

클라이언트 유효성 검사를 할때 주의사항이 있습니다. 예를 들어 설명하면 클라이언트 스크립트에서 jquery ajax를 통해 웹서비스등에 연결하여 DB결과를 불러오는 경우 결과에 따라 args.IsValid 값이 결정된다면 꼭 다음과 같이 async 속성을 false 로 지정하시기 바랍니다.
type: 'POST',
url: '/webservice/test.asmx/test',
data: '{ av: "' + args.Value + '"  }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
cash: false,
async:false
CustomerValidator 컨트롤이 클라이언트 스크립트 함수를 호출할때 DB의 결과를 불러와 args.IsValid 를 설정하기도 전에 CustomerValidator 컨트롤이 스크립트 수행을 완료해 버리고 결과를 true 로 반환해 버리는 상황이 발생할 수 있기 때문입니다. 웹서비스에 연결하고 DB를 쿼리해 가져오기까지의 시간이 걸리는 문제로 동기화가 제대로 이루어지지 않으면 CustomerValidator 컨트롤은 제대로 동작하지 않을 수 있으니 참고하시기 바랍니다.

 서버 유효성 검사

CustomerValidator 컨트롤은 위에서 실행한 클라이언트 유효성 검사를 서버에서도 똑같이 수행하도록 할 수 있습니다.

이를 위해 다음과 같이 CustomerValidator 컨트롤 속성에 ClientValidationFunction 대신 OnServerValidate 속성을 사용하고 해당 이벤트를 연결하도록 합니다.
영구와 : <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="반드시 '땡칠이'여야 합니다." ControlToValidate="TextBox1" OnServerValidate="CustomValidator1_ServerValidate"></asp:CustomValidator>
그리고 연결된 이벤트안에서 원하는 유효성검사 논리를 작성합니다.
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
    if (args.Value != "땡칠이") {
        args.IsValid = false;
    }
}
여기까지 하면 입력된 값이 원하는 내용이 아닌경우 ErrorMessage 에 설정한 오류메세지가 출력되도록 할 수 있습니다.

다만 유효성검사를 서버측에서 수행하는 경우 페이지에 PostBack 이 발생할때 유효성검사를 통화하지 못할경우에 대한 처리를 따로 작성할 필요가 있습니다. CustomerValidator 컨트롤은 자동적으로 PostBack 이후의 처리를 제한하지 않습니다.

예를 들어 TextBox 에 특정 내용을 입력 후 '전송' 버튼을 누른다고 했을때
<asp:Button ID="Button1" runat="server" Text="전송" OnClick="Button1_Click" />
해당 이벤트(버튼 클릭 이벤트)안에서 IsValid 속성을 확인해 true 여야만 정해진 부분이 수행되도록 하는 것입니다.
protected void Button1_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
        Label1.Text = "처리됨";
}
CustomerValidator 컨트롤을 사용하는 경우 특별한 경우가 아니면 클라이언트와 서버의 유효성검사를 모두 지정하여 유효성 검사를 수행할 수 있도록 하는것이 좋습니다.

클라이언트 유효성검사는 서버측에 전달되기전 클라이언트 브라우저 안에서 유효성검사가 확인되므로 서버에 부담을 줄여주는 효과가 크지만 유효성검사자체를 클라이언트의 스크립트에 의존하므로 이는 얼마든지 악의적인 사용자에 의해 우회될 수 있기 때문입니다.

따라서 이런 경우를 대비해 서버측에서도 필요하다면 유효성검사를 수행하도록 하는 것이 더 안전한 방법이라 할 수 있습니다.
0 0