Я просто перечисляю флажки, чтобы выбрать языки, разработчик которых талантлив. Мне нравится проверять, что должен быть выбран хотя бы один язык.
Проверка на стороне сервера работает без сбоев. Однако мне не удалось заставить ее работать на стороне клиента. Даже метод «GetClientValidationRules» никогда не вызывался.
IEnumerable не поддерживается для проверки на стороне клиента? Как это сделать?
ps: мне не нужно помещать коды проверки js, потому что я думаю, что все будет в порядке после вызова GetClientValidationRules
Вид: (упрощено для краткости)
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)