0

ドロップダウンリストの特定の値が選択されたときにのみ起動するバリデーターを作成しようとしています。

このフォームには、国用と米国用の2つのドロップダウンリストがあります。米国のドロップダウンリストには、米国が国のドロップダウンリストから選択されている場合にのみ表示されます。

米国が国として選択されている場合にのみ、[州]ドロップダウンリストリストを必須フィールドにするバリデーターが必要です。

背景情報として、これはMVC3 Webアプリケーションであり、Statesドロップダウンリストの表示/非表示コードはJQueryです。

4

2 に答える 2

1

もう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");
        }
    });
});

そしてあなたのViewModelのために


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
}

于 2012-09-10T14:12:27.413 に答える
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パッケージが役立つ場合もあります。

于 2012-09-10T13:16:09.677 に答える