不引人注目的MVC3验证组复选框

时间:2011-04-14 11:34:20

标签: asp.net-mvc asp.net-mvc-3

我需要使用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不引人注目的验证),那将是最好的。

由于

2 个答案:

答案 0 :(得分:21)

好的,想通了:

用于服务器验证: 使用数据注释(必需将这样做)

在我的视图模型中是这样的:

[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 });  

...

不确定这是否是最好的解决方案,但它有效:)。如果有人知道更好,请发帖。

答案 1 :(得分:4)

这样做 - 在提交时适当验证,如果随后检查或取消选中复选框,并且开销最小(仅在每个验证周期点击一次),则隐藏/显示验证消息。

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属性,所以服务器端验证由现有框架处理。