Не мога да накарам валидирането от страна на клиента да работи за 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