Ненавязчивая проверяющая группа MVC3

Мне нужно проверить группу флажков с помощью ненавязчивой проверки MVC3. как бы я это сделал? Я нашел это и попробовал, но он не работает.

$(function(){

        $.validator.addMethod('cb_selectone', function(value,element){
            if(element.length>0){
                for(var i=0;i<element.length;i++){
                    if($(element[i]).val('checked')) return true;
                }
                return false;
            }
            return false;
        }, 'Please select at least one option');

        $('#main').validate({rules:{Services:"cb_selectone"}});

...

Мой Html:

<input type="checkbox" class="checkbox" name="Services" value="1" />
<input type="checkbox" class="checkbox" name="Services" value="2" />
<input type="checkbox" class="checkbox" name="Services" value="3" />

Было бы лучше, если бы кто-то предоставил полное решение с проверкой на стороне сервера + на стороне клиента (конечно, используя ненавязчивую проверку MVC3).

Спасибо

Ответ 1

Хорошо, понял:

для проверки сервера: используя аннотации данных (обязательно это сделает)

как в моей модели:

[Required(ErrorMessageResourceName = "fld_Service_val_Required_lbl", ErrorMessageResourceType = typeof(Resources.Service.Controllers.Firm))]
public ICollection<int> Services { get; set; }

для проверки клиента в моем html я добавил флажки к моим вводам:

<input type="checkbox" class="checkbox required-checkbox" name="Services" value="1" />
<input type="checkbox" class="checkbox required-checkbox" name="Services" value="2" />
<input type="checkbox" class="checkbox required-checkbox" name="Services" value="3" />

а также:

$(function(){
        $.validator.addMethod('required_group', function(value, element) {
            var $module = $(element).parents('form');
            return $module.find('input.checkbox:checked').length;
        }, 'Select at least one Service please');
        $.validator.addClassRules('required-checkbox', { 'required_group' : true });  

..

не уверен, что это лучшее решение, но оно работает:). если кто-то знает лучше, пожалуйста, напишите.

Ответ 2

Это работает - проверяет правильность отправки и скрывает/отображает сообщение проверки, если флажок установлен или не установлен с минимальными накладными расходами (только один раз за цикл проверки).

JavaScript:

(function ($) {
    //functions from unobtrusive:
    function setValidationValues(options, ruleName, value) {
        options.rules[ruleName] = value;
        if (options.message) {
            options.messages[ruleName] = options.message;
        }
    }
    var formEls;
    function getUniqueFormId(form) {
        if (typeof(formEls==='undefined')) {
            formEls = document.getElementsByTagName('form');
        }
        return 'form' + Array.prototype.indexOf.call(formEls, form);
    }
    //from jQuery validation
    function findByName(name, form) {
        // select by name and filter by form for performance over form.find("[name=...]")
        return $(document.getElementsByName(name)).map(function (index, element) {
            return element.form == form && element.name == name && element || null;
        });
    }
    //-------------------------
    $.validator.addMethod('requiredgroup', function (value, element, params) {
        for (var i = 0; i < params.length; i++) {
            if (params[i].checked) { return true; }
        }
        return false;
    });
    valGroups = [];
    $.validator.unobtrusive.adapters.add('requiredgroup', function (options) {
        var groupName = options.element.name,
            uniqueGroup = getUniqueFormId(options.form) + groupName;
        if (!valGroups[uniqueGroup]) {
            valGroups[uniqueGroup] = findByName(groupName, options.form);
        }
        //jQuery Validation Plugin 1.9.0 only ever validates first chekcbox in a list
        //could probably work around setting this for every element:
        setValidationValues(options, 'requiredgroup', valGroups[uniqueGroup]);
    });
} (jQuery));

конечно, элементы должны иметь атрибут data-val-requiredgroup. Следующий код MVC (как часть помощника) добавит соответствующие аннотации:

 var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
 string name = ExpressionHelper.GetExpressionText(expression);

 var baseAttr = htmlHelper.GetUnobtrusiveValidationAttributes(name, metaData);

  baseAttr.Add("name", name);

  baseAttr.Add("type", "checkbox");
  if (metaData.IsRequired) 
   {
       baseAttr.Add("data-val-requiredgroup", baseAttr["data-val-required"]);
       baseAttr.Remove("data-val-required");

Поскольку он ищет атрибут Required, проверка на стороне сервера обрабатывается существующей инфраструктурой.