Просто изброявам квадратчетата за отметка, за да избера езици, чийто разработчик е талантлив. Искам да поставя потвърждение, че трябва да бъде избран поне един език.
Валидирането от страна на сървъра работи безпроблемно. Въпреки това не успях да го накарам да работи от страна на клиента.Дори методът „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)