본문 바로가기
ASP.NET MVC/ASP.NET MVC2

mvc2 Ajax.BeginForm 호출시 validation이 동작하지 않는 현상

by Hwoarang757 2013. 12. 17.

Ajax.BeginForm 호출시 validation이 동작하지 않는 현상

 

- 제목 그대로 Ajax.BeginForm 호출시 Model 클래스를 통해 IDataErrorInfo를 상속받아 유효성을 검사하여 어긋난다면

 

<%= Html.ValidationMessage("modelName") %> 이라던지 <%= Html.ValidationSummary() %> 를 이용하여

 

메세지를 출력하려 했습니다. 하지만 메세지는 출력이 되지 않았습니다.

 

Html.BeginForm을 이용하여야 정상적으로 동작하였습니다.

 

View 부분 -----------------------

<% Html.EnableClientValidation(); %>


<% using(Ajax.BeginForm("UserInfoModifySaveResult","User",null,new AjaxOptions { HttpMethod="POST" },new { id = "frmModifyUser" } )) { %>


<%= Html.Hidden("ACTIONINFO",ViewData["ACTIONINFO"].ToString(), new { id ="hdActionValue" } ) %>

<table border="0" cellpadding="0" cellspacing="0" width="100%" >

<tr>

<td valign="middle">

<table border ="1" cellpadding="2" cellspacing="0" width="100%">

<tr height="20px">

<td align="center" class="titleTd" width="10%" valign="middle" >사용자 등록 일련 번호</td>

<td align="center" class="contentTd" width="15%" valign="middle">

<%=Html.TextBox("USERINFO_SERIAL", Model.USERINFO_SERIAL,new { style="width:99%" ,@readonly="readonly"} ) %>

<%= Html.ValidationMessage("USERINFO_SERIAL")%>

<%= Html.ValidationSummary() %>

</td>

 

<% } %>

 


Model 부분 -----------------------

 

public class UserModifyContext : IDataErrorInfo

{

public int USERINFO_SERIAL { get; set; }


#region IDataErrorInfo


public string Error

{

get { return null ; }

}

 

 


public string this[string columnName]

{

get

{

if (columnName == "USERINFO_SERIAL")

{

if (string.IsNullOrEmpty(USERINFO_SERIAL))

{

return "일련번호를 입력하셔야 합니다..";

}


}

return null;

}

}


#endregion

 

 

위와 같이 구성하고 실행 하였으나 .  역시나

<%= Html.ValidationSummary() %> 부분이 동작하지 않았습니다.  마찬가지로 Html.BeginForm 메서드로는 동작이 잘 되었습니다.

 

방법을 찾다보니 PartialView에 validation 메세지를 출력하는 방안이 있었습니다.

 

뷰에서는 Ajax 로 비동기 호출되어 리턴 된 파샬뷰를 렌더할 타겟을 지정합니다.

<% using(Ajax.BeginForm("UserInfoModifySaveResult","User",null,new AjaxOptions { HttpMethod="POST", 

 

UpdateTargetId="divValidation"


 },new { id = "frmModifyUser" } )) { %>

 

 

<div id =” divValidation”> </div>

 

------------위의 submit 시 호출되는 Controller 내용입니다.


public ActionResult UserInfoModifySaveResult(UserModifyContext modifyContext)

{

if (Request.IsAjaxRequest())

{

return PartialView();

}

return View();

}

 


클라이언트에서 요청한 형식이 Ajax 요청인지 확인하고 파샬뷰에 유효성 검사 메세지를 출력합니다.

 

결코 좋은 해결방법은 아닌거같습니다. 원하는 부분에 벨리데이션 메세지를 출력하는데 어려움이 느껴지고

 

ie 8 에서는 렌더된 후 메세지가 새창으로 리디렉트 되는 현상도 있어서 이방법을 포기할 수 밖에 없었습니다.

 

굳이 Ajax.BeginForm을 이용해서 유효성 검사를 해보자고 마음먹고

 

Model 클래스에서는 IDataErrorInfo를 이용해 유효성 검사를 하지 않고

 

Controller에서 Model객체를 받아 유효성 검사를 하는 임시방편밖에없었습니다.

 

메세지는 JavaScriptResult를 이용하여 Alert창을 직접 호출하였습니다.

 

 

public ActionResult UserInfoModifySaveResult(UserModifyContext modifyContext)

{


string validationResult = UserDataValiDation(modifyContext);


if (validationResult != "SUCCESS")

{

return JavaScript("alert('실패하였습니다. " + validationResult + "');");

}

else

{

return JavaScript("alert('성공하였습니다.')");

}

}


 

 

private string UserDataValiDation(UserModifyContext modifyContext)

{

string errorMessage = string.Empty;



if (modifyContext.USERINFO_ID == "" || string.IsNullOrEmpty(modifyContext.USERINFO_ID))

{

errorMessage = "아이디를 입력해 주십시오";

}

if (modifyContext.USERINFO_PASS == "" || string.IsNullOrEmpty(modifyContext.USERINFO_PASS))

{

errorMessage = "비밀번호를 입력해 주십시오";

}



if (string.IsNullOrEmpty(errorMessage))

{

return "SUCCESS";

}

return errorMessage;

}


좋은 해결 방안이 있다면 가르쳐 주시면 감사드립니다 (__)