開発者が才能を発揮する言語を選択するためのチェックボックスをリストするだけです.少なくとも1つの言語を選択する必要があるという検証を行うのが好きです.
サーバー側の検証は失敗せずに機能しますが、クライアント側で機能させることができませんでした。「GetClientValidationRules」メソッドでさえ呼び出されたことはありません。
IEnumerable はクライアント側の検証でサポートされていませんか?これを行う方法は何ですか?
ps: GetClientValidationRules が呼び出されたら問題ないと思うので、js 検証コードを入力する必要はありません。
表示: (簡潔にするために簡略化しています)
public class DeveloperViewModel
{
[DeveloperLanguageSelectOneValidation(ErrorMessage="Please check at least one lang")]
public IEnumerable<SelectListItem> LanguagesModel { get; set; }
}
検証:
public class DeveloperLanguageSelectOneValidationAttribute : ValidationAttribute ,IClientValidatable
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
IEnumerable<SelectListItem> items = (IEnumerable<SelectListItem>)value;
foreach (var item in items)
if (item.Selected)
return ValidationResult.Success;
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "developerlanguageselectone"
};
return new[] { rule };
}
}
SelectListItem ビュー:
@model SelectListItem
<li>
@Html.HiddenFor(a => a.Value)
@Html.CheckBoxFor(a => a.Selected)
@Html.DisplayFor(a => a.Text)
</li>
開発者ビュー:
<ul>
@Html.EditorFor(a => a.LanguagesModel)</ul>
@Html.ValidationMessageFor(a => a.LanguagesModel)