2011-11-04 2 views
1

mvc3 응용 프로그램에서 작업 중이며 사용자 정의 validationMessage를 작성하여 간단한 필드의 유효성을 검사했습니다. 내가 사용하는 경우사용자 정의 Html.ValidationMessageFor가 클라이언트 측에서 작동하지 않습니다.

public static MvcHtmlString ValidationCustomFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) 
{ 
    string propertyName = ExpressionHelper.GetExpressionText(expression); 
    string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)); 

    if (helper.ViewData.ModelState[name] == null || 
     helper.ViewData.ModelState[name].Errors == null || 
     helper.ViewData.ModelState[name].Errors.Count == 0) 
    { 
     return MvcHtmlString.Empty; 
    } 

    StringBuilder htmlValidation = new StringBuilder(); 

    htmlValidation.AppendLine("<div>"); 
    htmlValidation.AppendLine("<table>"); 
    htmlValidation.AppendLine("<tr>"); 
    htmlValidation.AppendLine("<td><img src='/Content/Imgages/Error.jpg'></td>"); 
    htmlValidation.AppendLine("</tr>"); 
    htmlValidation.AppendLine("<tr>"); 
    htmlValidation.AppendFormat("<td>{0}</td>", name); 
    htmlValidation.AppendLine("</tr>"); 
    htmlValidation.AppendLine("<tr>"); 
    htmlValidation.AppendFormat("<td>{0}</td>", helper.ViewData.ModelState[name].Errors[0].ErrorMessage); 
    htmlValidation.AppendLine("</tr>"); 
    htmlValidation.AppendLine("</table>"); 
    htmlValidation.AppendLine("</div>"); 

    return MvcHtmlString.Create(htmlValidation.ToString()); 

} 

이 잘 작동 :

@Html.ValidationMessageCustomFor(model => model.FirstName) 

이 내 사용자 지정 유효성 검사 코드입니다 :이 사용자 정의 validationMessage는 대신 기본 범위의 제목과 메세지를 DIV를 보여, 난이 있습니다 서버 쪽 유효성 검사,하지만 내가 클라이언트 쪽 유효성 검사를 할 때 작동하지 않습니다.

기본값 인 Html.ValidationMessageFor는 클라이언트 측 유효성 검사에서 올바르게 작동하지만 내 사용자 지정 Html.ValidationMessageCustomFor는 작동하지 않습니다.

제발 도와 주실 수 있나요? 나는 내 사용자 지정 도우미를 수정


, 내가 "데이터 valmsg-은"스팬에 대한 atrib을 추가, 그것은 코드 :

public static MvcHtmlString ValidationCustomFor2<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) 
    { 
     string propertyName = ExpressionHelper.GetExpressionText(expression); 
     string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)); 

     if (helper.ViewData.ModelState[name] == null || 
      helper.ViewData.ModelState[name].Errors == null || 
      helper.ViewData.ModelState[name].Errors.Count == 0) 
     { 
      return MvcHtmlString.Empty; 
     } 

     TagBuilder tag = new TagBuilder("span"); 
     tag.Attributes.Add("class", "field-validation-error"); 
     tag.Attributes.Add("data-valmsg-for", name); 
     tag.Attributes.Add("data-valmsg-replace", "true"); 

     var text = tag.ToString(TagRenderMode.StartTag); 
     text += "<b>My custom html</b>"; 
     text += tag.ToString(TagRenderMode.EndTag); 


     return MvcHtmlString.Create(text); 

    } 

그러나 그것이 내가 보이는, 표시되지 않습니다 클라이언트 쪽에서 뭔가를해야하지만, 나는 무엇을 모르나요? 어떤 아이디어라도 제발?

+0

"ValidationMessageCustomFor"헬퍼 메서드는 무엇입니까? MVC3 프레임 워크에는 그러한 도우미 메서드가 없습니다. 그것은 당신이 코딩 한 도우미입니까? – Iravanchi

+0

그래, 그것은 내 사용자 정의 도우미, 그것은 단순히 유효성 검사 메시지, 제목 및 이미지와 div를 보여, 그것은 서버 측 유효성 검사에 잘 작동하지만, 내가 클라이언트 측 그것을 작동하지 않으면, 이미지와 div 나타나지 않습니다. 문제가 무엇인지에 대해 나에게 몇 가지 아이디어를 제공해 주시겠습니까? –

+0

문제가 있으면 사용자 지정 도우미 메서드와 관련이 있어야합니다. 코드 스 니펫을 게시하고 유효성 검사를 수행하는 방법을 게시 할 수 있습니까? – Iravanchi

답변

1

ASP.NET MVC3 유효성 검사는 서버 측 및 클라이언트 측 방법을 모두 사용하여 작동합니다.

서버 쪽 코드를 작성하여 렌더링 된 페이지에 도우미 메서드와 같이 유효성 검사 메시지를 추가하면 클라이언트 쪽 유효성 검사가 수행되는 동안 요청이 실제로 서버로 전송 될 때만 코드가 호출됩니다. 사용 가능으로 설정하면 요청이 서버로 다시 보내지지 않습니다.

MVC3 클라이언트 측 유효성 검사의 기본 구현은 무시 무시한 JavaScript 유효성 검사라는 기술을 사용하여 페이지에 data- 속성을 추가 한 다음 JavaScript에서 표시된 요소를 찾아 조작합니다.

눈에 잘 띄지 않는 자바 스크립트 유효성 검사를 이해하려면 검색해보세요. 많은 자료가 있습니다. 예를 들어 : 귀하의 경우

http://www.codeproject.com/KB/aspnet/CustomClientSideValidatio.aspx

, 당신은 확인 메시지를 표시 할 위치를 지정하려면, 당신은 data-valmsg-for 속성으로 HTML 요소를 표시해야합니다. 예를 들면 :

<SPAN data-valmsg-for="id_of_the_input_to_validate"></span> 

자바 스크립트가 위의 속성에 대해보고 입력이 유효하지 않은 경우에 확인 메시지와 함께 SPAN을 채울 것입니다 검증. 다시 말하지만, 이것은 폼의 포스트 백 이전에 발생하기 때문에 유효성 검사가 폼을 제출할 수 없기 때문에 검증 메시지를 보여주는 서버 측 코드는 호출되지 않습니다.여기

은 MVC3에 포함 된 실제 검증 메시지 도우미에서 코드입니다 :

TagBuilder builder = new TagBuilder("span"); 
... 
if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) { 
    builder.MergeAttribute("data-valmsg-for", modelName); 
    builder.MergeAttribute("data-valmsg-replace", replaceValidationMessageContents.ToString().ToLowerInvariant()); 
} 

편집 : 편집 한 질문에 대답 :

페이지가 렌더링 첫 번째 시간, 먼저 iftrue (렌더링 할 유효성 검사 오류 메시지가 없음)이므로 빈 문자열을 반환합니다. 페이지에 data- 속성이 없습니다.

오류 메시지가없는 경우에도 항상 <span data-valmsg-for="..."></span>을 렌더링해야합니다. 그러면 JavaScript 라이브러리는 클라이언트 측에서 발생하는 경우에 대비하여 오류를 넣을 위치를 알 수 있습니다.