2012-11-19 3 views
0

select 요소에서 클라이언트 측 유효성 검사를 사용하려고하지만 양식이 처음로드 될 때 작동하지 않습니다. 선택 요소 클라이언트 측 유효성 검사가 게시 이후에만 나타납니다.

(이 내 모델 내부 클래스 내에 실제로) 내 모델의 속성입니다 :

[Required(ErrorMessage="Please select an application type.")] 
public override string Application 
{ 
    get 
    { 
     return base.Application; 
    } 
    set 
    { 
     base.Application = value; 
    } 
} 

이 뷰의 일부입니다

<div class="field_title"> 
    Application Type 
</div> 
<div class="field_validation"> 
    @Html.ValidationMessageFor(model => model.CreatePromocode.Application) 
</div> 
<div class="form_field"> 
    @Html.DropDownListFor(model => model.CreatePromocode.Application, 
     SharedLibrary.Entities.DropDownLists.PromocodeApplicationOptions, 
     "Select an application type...") 
</div> 

이 드롭 다운리스트 항목 코드 이 방법으로 다른 응용 프로그램에서 사용할 수 있으므로 여러 개가 아닌 한 곳에서 변경할 수 있습니다.

public class DropDownLists 
{   
    public static List<SelectListItem> PromocodeApplicationOptions 
    { 
     get 
     { 
      return new List<SelectListItem>() 
      { 
       new SelectListItem() { 
        Text="Earlybird Registration", Value="Earlybird"}, 
       new SelectListItem() { 
        Text="Standard Registration", Value="Standard"}, 
       new SelectListItem() { 
        Text="Monday Registration", Value="Monday"}, 
       new SelectListItem() { 
        Text="Tuesday Registration", Value="Tuesday"}, 
       new SelectListItem() { 
        Text="Wednesday Registration", Value="Wednesday"}, 
       new SelectListItem() { 
        Text="Multiple Tickets", Value="TicketMany"}, 
       new SelectListItem() { 
        Text="Single Ticket",Value="TicketSingle"} 
      }; 
     } 
    } 
} 

내가 겪고있는 문제는 사용자가 처음 페이지에 도착하면 드롭 다운 목록에 클라이언트 측 유효성 검사 속성이 없다는 것입니다. 양식 그러나 게시되면 그것은이

<select id="CreatePromocode_Application" name="CreatePromocode.Application"> 

처럼 보이는, 그리고 ModelState 응용 프로그램 유형이 선택되지 않았기 때문에, 클라이언트 검증 한 다음 드롭 다운 목록에 표시하고 잘 작동 유효하지 않습니다.

<select data-val="true" 
    data-val-required="Please select an application type." 
    id="CreatePromocode_Application" 
    name="CreatePromocode.Application" 
    class="valid"> 

어떻게 처음부터 클라이언트 측 유효성 검사를 수행 할 수 있습니까? 데이터 주석을 사용하는 목적을 상쇄하기 때문에 필요한 속성과 오류 메시지를 직접 추가하지 않아도됩니다.

+0

드롭 다운 목록 또는 다른 모델 속성에서도 이와 같은 현상이 발생합니까? – HTX9

+0

드롭 다운 목록에서만 다른 속성 (텍스트 상자)은 모두 클라이언트 쪽 유효성 검사를 처음으로합니다. –

답변

1

이 샘플의 기본 생성자로보기 모델의 CreatePromoCode 속성을 초기화되어 있는지 확인 :

public class YourViewModel 
{ 
    public YourViewModel() 
    { 
     CreatePromoCode = new CreatePromoCode(); 
    } 

    public BaseCreatePromoCode CreatePromoCode { get; set; } 

} 

public class BaseCreatePromoCode 
{ 
    public virtual string Application { get; set; } 

} 

public class CreatePromoCode : BaseCreatePromoCode 
{ 
    [Required] 
    public override string Application { get; set; } 
} 

하기 위해 뷰 모델의 CreatePromoCode 속성의 실행시의 형태를 사용합니다 Html 헬퍼 해당 속성에 대한 메타 데이터를 가져오고 클라이언트 측 유효성 검사를위한 데이터 속성을 설정하십시오. 따라서 유효성 검사는 Required 특성이 실제로 파생 클래스에서만 설정되는 경우에도 작동합니다.

초기 게시 이후에 오류가 발생하면 MVC 바인더에서 뷰 모델 및 CreatePromoCode 개체의 인스턴스를 만들었습니다. 오류가 표시 될 뷰를 다시 렌더링하면 개체가 초기화 될 때 데이터 특성이 설정되고 클라이언트 유효성 검사가 시작됩니다.

+0

고마워, 그게 문제 였어. 그것은 너무 명백한 지금/facepalm 보인다. –

관련 문제