2013-06-02 11 views
4

문제가 있습니다. 기본적으로 양식이 많이 있으며, 모든 속성에 필수 속성 집합이 있으므로 비워 두거나 확인을 클릭하십시오. 클라이언트 측 유효성 검사를 받으면 빨간색이됩니다. EditorTemplate을 제외한 모든 항목에 대해 단어를 올바르게 적용합니다.MVC3 편집기 템플릿은 클라이언트 측 유효성 검사를 생성하지 않습니다.

내 모델은 다음입니다 :

public class MyModel 
{ 
    [Required] 
    public string Username{get;set;} 

    public Location Loc{get;set;} 
} 

public class Location 
{ 
    [Required] 
    public string Loc1{get;set;} 
    [Required] 
    public string Loc2{get;set;} 
} 

를 내 기본보기에서 다음과 같은 한 : 여기

@Html.EditorFor(m => m.Location, Model.Location) 

그리고 나의 EditorTemplate입니다 :

<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.Loc1) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.Loc1, Model.Locs==null?Enumerable.Empty<SelectListItem>():Model.Locs, "---select--", new { @class = "location-ddl" }) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.Loc1) 
    </td> 
</tr> 

...

조사 후 당신이 그것을 볼 수 있듯이

<select name="Location.Loc1" id="Location_Loc1"> 

클라이언트 측 유효성 검사에 대한 몇 가지 특성을 부족, 일반적으로는 다음과 같이해야한다 :

<select name="Loc1" id="Loc1" data-val-required="The Loc1field is required." data-val="true"> 

내 질문은 NG가 thouroughtly 내가 그것을 prodcues HTML은 다음과 같은 것을 발견 , 왜 편집기 템플릿이 클라이언트 쪽에서 유효성 검사와 함께 올바른 html 출력을 생성하지 않으며 어떻게 수정해야합니까?

메모는 단지 서버 쪽에서 작동하므로 서버 쪽에서 선택 항목이 비어 있으면 채워지지 않은 것으로 표시되어 다시 전송됩니다. 하지만 여전히 편집기 폼의 동작과이를 수정하는 방법을 이해하고 싶습니다.

감사

+1

'UserName' 속성에 대한 클라이언트 측 유효성 검사가 작동합니까? – Shyju

+0

예, 작동합니다! – Alnedru

+0

아무도 이런 종류의 문제를 실제로 발견하지 못했습니까? – Alnedru

답변

1

당신은 검증 특성을 얻기 위해 Html.GetUnobtrusiveValidationAttributes("Location.Loc1")를 사용할 수 있습니다. here 문서를 참조하십시오.

0

Html.GetUnobtrusiveValidationAttributes()의 사용법을 더 자세히 설명해야한다고 생각합니다. 이런 식으로, 당신의 HtmlHelpers

@{ 
    IDictionary<string, Object> htmlAttributeValuePairsLoc1 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString()); 
    htmlAttributeValuePairsLoc1.Add("class","location-ddl"); 

    IDictionary<string, Object> htmlAttributeValuePairsLoc2 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString()); 
    htmlAttributeValuePairsLoc2.Add("class","location-ddl"); 
} 

지금 적절한 사전을 주입 할 수

편집기 템플릿 모델 Location이라고 가정하면, 파일의 맨 위에 다음 코드 블록을 추가했다 :

<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.Loc1) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.Loc1, 
       Model.Locs??Enumerable.Empty<SelectListItem>(), 
       "---select--", 
       htmlAttributeValuePairsLoc1) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.Loc1) 
    </td> 
</tr> 

PS Html.NameFor()이 MVC4에 등장했지만 Reflection을 사용하면 속성 이름을 얻을 수 있습니다.