2012-09-10 3 views
0

몇 가지 조언이 필요합니다. 드롭 다운 목록의 특정 값을 선택할 때만 발생하는 유효성 검사기를 작성하려고합니다.다른 드롭 다운 목록에서 미국이 국가로 선택된 경우 상태 드롭 다운 목록 유효성 검사

이 양식에는 국가별로 두 개의 드롭 다운 목록이 있으며 미국 드롭 다운 목록에는 미국이 국가 드롭 다운 목록에서 선택된시기 만 표시됩니다.

미국이 국가로 선택된 경우에만 상태 드롭 다운 목록을 필수 입력란으로 만드는 유효성 검사기가 필요합니다.

MVC3 웹 응용 프로그램과 상태 드롭 다운 목록의 표시/숨기기 코드에 대한 배경 정보는 JQuery입니다.

당신은 지정 유효성 검사 속성을 쓸 수
+2

지금까지 뭐 했니? – Th0rndike

+0

은 Foolproof Validation NuGet 패키지를 사용하여 프로젝트 비즈니스 로직 도메인 프로젝트의 유효성 검사 모델 상태 필드에 RequiredIf를 추가하려고 시도했으며 JQuery를 사용하여 드롭 다운리스트의 유효성을 검사하려고 시도했습니다 – CryoFusion87

답변

1

또 다른 대안은 유효성 검사를 위해 jQuery에 규칙을 동적으로 추가하는 것입니다. 그러나 서버 측에서도이 사용자 지정 논리를 확인해야합니다. 컨트롤러에서이 작업을 수행 할 수 있습니다. 또는 VieWModel이 IValidateableObject를 구현하여 country = "usa"인지 확인한 다음 카운티가 필요하면 이상적입니다.

사용 jQuery의 .rules.add 및 .remove는 :

http://docs.jquery.com/Plugins/Validation/rules#.22remove.22rules

그래서 당신의 라인을 따라 뭔가를 할 수 :

 

$(document).ready(function() { 
    $("#country").change(function(){ 
     if($(this).val()=="usa") 
     { 
      $("#yourCountyDropDown").rules("add", { 
      required: true, 
      messages: { 
      required: "County is required" 
      } 
      }); 
     } 
     else 
     { 
      $("#yourCountyDropDown").rules("remove"); 
     } 
    }); 
}); 
 

와 뷰 모델에 대한


public class WhateverYourObjectNameCreateViewModel : IValidatableObject 
{ 
     #region Validation 
     public IEnumerable Validate(ValidationContext validationContext) 
     { 
      if (this.Country=="USA" && string.IsNullOrEmpty(this.County)) 
      { 
       yield return new ValidationResult("County is required"); 
      } 
     } 
     #endregion 
} 
 
+0

미국이 검증해야하는 필수 입력란이 아니며 마스터 카드가 지불을 처리하는 방식으로 인해 국가가 필수 입력란이며 국가 입력란이 이미 표준으로 필요하며 국가가 선택되었는지 여부를 확인해야합니다 미국 – CryoFusion87

+0

doh 죄송합니다, 쉽게 충분합니다 - 카운티 = "us"일 때 유효성을 검사 했으므로 "County"를 "State"로 변경하십시오. –

+0

또한 아래 Darin의 확장 기능을 사용하면 클라이언트 측 유효성 검사도받을 수 있습니다 - 참조 : https://gist.github.com/1547191 –

0

:

public class RequiredIfAttribute : ValidationAttribute 
{ 
    public RequiredIfAttribute(string otherProperty, object otherPropertyValue) 
    { 
     OtherProperty = otherProperty; 
     OtherPropertyValue = otherPropertyValue; 
    } 

    public string OtherProperty { get; private set; } 
    public object OtherPropertyValue { get; private set; } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var property = validationContext.ObjectType.GetProperty(OtherProperty); 
     if (property == null) 
     { 
      return new ValidationResult(string.Format("Unknown property: {0}", OtherProperty)); 
     } 

     object otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null); 
     if (!object.Equals(OtherPropertyValue, otherPropertyValue)) 
     { 
      return null; 
     } 

     if (value != null) 
     { 
      return null; 
     } 

     return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); 
    } 
} 

지금 당신이보기 모델을 가질 수를 :

public class MyViewModel 
{ 
    public string Country { get; set; } 
    [RequiredIf("Country", "usa", ErrorMessage = "Please select a state")] 
    public string State { get; set; } 

    public IEnumerable<SelectListItem> Countries 
    { 
     get 
     { 
      return new[] 
      { 
       new SelectListItem { Value = "fr", Text = "France" }, 
       new SelectListItem { Value = "usa", Text = "United States" }, 
       new SelectListItem { Value = "spa", Text = "Spain" }, 
      }; 
     } 
    } 
    public IEnumerable<SelectListItem> States 
    { 
     get 
     { 
      return new[] 
      { 
       new SelectListItem { Value = "al", Text = "Alabama" }, 
       new SelectListItem { Value = "ak", Text = "Alaska" }, 
       new SelectListItem { Value = "az", Text = "Arizona" }, 
      }; 
     } 
    } 
} 

컨트롤러 :

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

및 전망 :

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.DropDownListFor(x => x.Country, Model.Countries, "-- Country --") 
     @Html.ValidationMessageFor(x => x.Country) 
    </div> 
    <div> 
     @Html.DropDownListFor(x => x.State, Model.States, "-- State --") 
     @Html.ValidationMessageFor(x => x.State) 
    </div> 
    <button type="submit">OK</button> 
} 

Foolproof package 유효성 확인 속성이 유용 할 수도 있습니다.

+0

감사합니다 Darin, 국가 목록 및 상태 목록은 모두 데이터베이스에서 가져온 것입니다. 게다가 이미 도메인 모델에 정의 된 두 개의 서로 다른 테이블의 값을 통해 가져 오는 뷰 모델이 있습니다. 도메인 모델에 정의 된 유효성 검사와 오류 메시지가 필요합니다. resources.resx 파일에서 오는 오류입니다. 현재 내 오류가 정의되어 있습니다. – CryoFusion87

+0

유효성 검사기에 대한 두 번째보기 모델을 작성하거나 현재보기 모델을 사용하고 필요에 따라 도메인 모델을 편집 할 가치가 있습니까? – CryoFusion87

+0

모든 경우에 뷰 모델을 사용해야합니다. 기존의 뷰 모델이 이미있는 경우 사용자 정의 유효성 검사기를 사용하여 해당 속성을 꾸밀 수 있도록 수정하십시오. 지역화 된 오류 메시지에 관한 한, 사용자 정의 유효성 검사 속성에서 'ErrorMessageResourceName' 및'ErrorMessageResourceType' 속성을 사용하면됩니다. 예를 들어 표준 Required 속성에서 사용하는 것과 같은 방식입니다. –

관련 문제