Не удалось заставить работать проверку на стороне клиента для IEnumerable‹T› в MVC3

Я просто перечисляю флажки, чтобы выбрать языки, разработчик которых талантлив. Мне нравится проверять, что должен быть выбран хотя бы один язык.

Проверка на стороне сервера работает без сбоев. Однако мне не удалось заставить ее работать на стороне клиента. Даже метод «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)

person sercan    schedule 01.12.2012    source источник


Ответы (1)


Как насчет использования jquery?

$.validator.addMethod('require-one', function(value) {
    return $('.require-one:checked').size() > 0;
}, 'Please check at least one box.');

var checkboxes = $('.require-one');
var checkbox_names = $.map(checkboxes, function(e, i) {
    return $(e).attr("name")
}).join(" ");

$("#itemForm").validate({
    groups: {
        checks: checkbox_names
    },
    errorPlacement: function(error, element) {
        if (element.attr("type") == "checkbox") error.insertAfter(checkboxes.last());
        else error.insertAfter(element);
    }
});

Ваша форма:

<form name="itemForm" id="itemForm" method="post">

<label for="checkbox1">checkbox1</label>
<input checked="checked" data-val="true" data-val-required="The checkbox1 field is required." id="checkbox1" name="checkbox1" type="checkbox" value="true" class="require-one" />
<input name="checkbox1" type="hidden" value="false" /><br />

<label for="checkbox2">checkbox2</label>
<input checked="checked" data-val="true" data-val-required="The checkbox2 field is required." id="checkbox2" name="checkbox2" type="checkbox" value="true" class="require-one" />
<input name="checkbox2" type="hidden" value="false" /><br />

<label for="checkbox3">checkbox3</label>
<input checked="checked" data-val="true" data-val-required="The checkbox3 field is required." id="checkbox3" name="checkbox3" type="checkbox" value="true" class="require-one" />
<input name="checkbox3" type="hidden" value="false" /><br />

<input type="submit" />
</form>

Из: https://stackoverflow.com/a/11512622/1026898

person Ecnalyr    schedule 02.12.2012
comment
Спасибо за ответ. Есть ли шанс сделать эту проверку ненавязчивой? - person sercan; 03.12.2012