2011-09-20 2 views
11

개인 데이터를 부분보기로 양식 중앙에 렌더링하는 간단한 형식이 있습니다. 이 양식에서 클라이언트 쪽 유효성 검사를 수행 할 수 없습니다. 나는 generate HTML을 쫓아 가기 시작했고 표준 양식과 부분보기에서 렌더링 된 동일한 모델 필드를 사용했다.MVC3 면도기 부분 뷰 렌더링에 데이터 유효성 검사 속성이 포함되어 있지 않습니다.

@html.partial 첫 번째 호출에서 입력 요소가 올바르게 채워 졌음을 발견했습니다. 다음은 ajax 요청을 통해 partialview가 다시로드 될 때만 발생합니다.

먼저 내 부분보기의 머리글, 기본 페이지의 Ajax.BeginForm 내에 있습니다. 여기

 <td> 
     <div class="editor-field"> 
     <input id="Player_Person_Addresses_0__PostalCode" maxlength="10" name="Player.Person.Addresses[0].PostalCode" style="width:80px;" type="text" value="" /> 
     </div> 
     </td> 

가 렌더링 동일 모델 필드이다

여기
@Html.ValidationMessageFor(model=>Model.Player.Person.Addresses[0].PostalCode) 
<table> 
    <tr> 
     <td style="width:200px;">City*</td> 
     <td>State</td> 
     <td>Zip/Postal Code</td> 
    </tr> 
    <tr> 
     <td>@Html.TextBoxFor(p=>Model.Player.Person.Addresses[0].CityName, new { style="width:200px;", maxlength=50 })</td> 
     <td> 
     @Html.DropDownListFor(p=> Model.Player.Person.Addresses[0].StateCode 
           , MPAUtils.GetStateList(Model.Player.Person.Addresses[0].StateCode))</td> 
     <td> 
     <div class="editor-field"> 
     @Html.TextBoxFor(p=>Model.Player.Person.Addresses[0].PostalCode, new { style="width:80px;", maxlength=10 }) 
     </div> 
     </td> 
    </tr> 
</table> 

상기 부분 뷰에서 렌더링 필드 : 여기

@model MvcMPAPool.ViewModels.EventRegistration 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"   type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() 
{ 
    $(".phoneMask").mask("(999) 999-9999"); 
}); 
</script> 

@{ 
    var nPhn = 0; 
    var dTotal = 0.0D; 
    var ajaxOpts = new AjaxOptions{ HttpMethod="Post", UpdateTargetId="idRegistrationSummary", OnSuccess="PostOnSuccess" }; 
    Html.EnableClientValidation(true); 
    Html.EnableUnobtrusiveJavaScript(true); 
} 

는 부분 뷰로부터 면도기 태그 인 표준보기 :

 <div class="editor-field">    
      <input data-val="true" data-val-length="The field Postal/Zip Code must be a string with a maximum length of 10." data-val-length-max="10" data-val-required="Postal or Zip code must be provided!" id="Person_Addresses_0__PostalCode" maxlength="10" name="Person.Addresses[0].PostalCode" title="Postal/Zip Code is required" type="text" value="" />  
      <span class="field-validation-valid" data-valmsg-for="Person.Addresses[0].PostalCode" data-valmsg-replace="true"></span>   
     </div> 

부분 뷰 렌더링에 입력 요소에 data-val-xxx 속성이 없음을 유의하십시오.

이 정보가 맞습니까? 클라이언트 측 유효성 검사가 이러한 특성없이 어떻게 작동 할 수 있는지 보지 않습니까?

+0

참조 ['@using (Html.BeginSubForm())'대답 (http://stackoverflow.com/a/8750181)에 [ASP.NET MVC 3 : 눈에 거슬리지 검증을 생성 BeginForm 레이아웃에있다] (http://stackoverflow.com/questions/4997269/asp-net-mvc-3-generate-unobtrusive-validation-when-beginform-is-on-the-layout). –

답변

18

눈에 거슬리지 않는 유효성 검사 특성을 만들려면 FormContext이 있어야합니다. 당신의 부분보기의 상단에있는 다음을 추가 : 데이터 유효성 검사 태그가되고 싶은 경우에, 당신은 FormContext에있을 필요가

if (this.ViewContext.FormContext == null) 
{ 
    this.ViewContext.FormContext = new FormContext(); 
} 
+0

FormContext를 검사했고 이미 설정되었으므로 모든 것이 원래대로 작동합니다. –

+0

부분 뷰를 기본 뷰로 옮겼으며 유효성 검사가 올바르게 작동합니다. 양식을 다시 작성하고 그대로두면 좋겠지 만이 작업을 수행하는 방법을 알고 싶습니다. –

+2

PartialView에는'@using Html.BeginForm()'또는'@using Ajax.BeginForm()'이 선언되어 있지 않으므로 PartialView에'FormContext'가 없습니다. 뷰로부터 불려 갔을 경우는 FormContext가 건네받습니다. 컨트롤러의 액션에서 호출 된 경우 FormContext는 전달되지 않습니다. 이 경우, PartialView는 FormContext를 인스턴스화해야한다. PartialView 맨 위에 내 대답에 코드 블록을 추가하면됩니다. – counsellorben

9

. 동적 양식의 일부를 생성하는 경우 따라서, 당신은 당신의 부분보기에 다음 행을 포함해야합니다

@{ if(ViewContext.FormContext == null) {ViewContext.FormContext = new FormContext(); }} 

당신은 당신이 동적으로 눈에 거슬리지 유효성 검사를 추가 할 때마다 리 바인드 확인해야을/제거 항목 :

$("#form").removeData("validator"); 
$("#form").removeData("unobtrusiveValidation"); 
$.validator.unobtrusive.parse("#form"); 
+0

답변하면 많은 도움이됩니다. 매우 감사합니다. – bubuxu

+0

@dazbradbury 이것들을 어디에 넣어야합니까? 나도 똑같은 문제가 있다고 말해줘. –

관련 문제