ASP.NET mVC 3.0 Проверить список флажков MVCContrib

Я реализую собственный валидатор, чтобы проверить, есть ли хоть что-то проверенное:

public class AtLestOneRequiredAttribute : RequiredAttribute
    {
        public override bool IsValid(object value)
        {
            return (value != null);
        }
    }

    public class RequiredListValidator : DataAnnotationsModelValidator<AtLestOneRequiredAttribute>
    {
        private readonly string errorMessage;

        /// <summary>
        /// Initializes a new instance of the <see cref="EmailValidator"/> class.
        /// </summary>
        /// <param name="metadata">The metadata.</param>
        /// <param name="context">The context.</param>
        /// <param name="attribute">The attribute.</param>
        public RequiredListValidator(ModelMetadata metadata, ControllerContext context, AtLestOneRequiredAttribute attribute)
            : base(metadata, context, attribute)
        {
            this.errorMessage = attribute.ErrorMessage;
        }

        /// <summary>
        /// Retrieves a collection of client validation rules.
        /// </summary>
        /// <returns>A collection of client validation rules.</returns>
        public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
        {
            var rule = new ModelClientValidationRule
            {
                ErrorMessage = errorMessage,
                ValidationType = "atlestonerequired"
            };

            return new[] { rule };
        }        
    }

Я также генерирую атрибуты ненавязчивой проверки для этого выбора (http://weblogs.asp.net/srkirkland/archive/2011/03/08/adding-unobtrusive-validation-to-mvccontrib-fluent-html.aspx)

Модель:

[AtLestOneRequired(ErrorMessage="At least one selection required")]
        public IList<int> MyCheckBox{ get; set; }

Просмотр:

@this.CheckBoxList(x => x.MyCheckBox).Options(Model.MyCheckBoxes).IncludeUnobtrusiveValidationAttributes(Html)

В результате я получаю этот html с ненавязчивыми атрибутами в:

<div data-val="true" data-val-atlestonerequired="At least one selection required" id="MyCheckBox">
    <input id="MyCheckBox_0" name="MyCheckBox" type="checkbox" value="1"/>
    <label for="MyCheckBox_0" id="MyCheckBox_0_Label">A</label>
    <input id="MyCheckBox_1" name="MyCheckBox" type="checkbox" value="2"/>
    <label for="MyCheckBox_1" id="MyCheckBox_1_Label">B</label>
    <input id="MyCheckBox_2" name="MyCheckBox" type="checkbox" value="3"/>
    <label for="MyCheckBox_2" id="MyCheckBox_2_Label">C</label>
    <input id="MyCheckBox_3" name="MyCheckBox" type="checkbox" value="4"/>
    <label for="MyCheckBox_3" id="MyCheckBox_3_Label">D</label>
    ....
</div>

Но мой валидатор не работает на стороне клиента, что мне нужно сделать, чтобы он заработал? Я думаю, может быть, мне нужно реализовать собственный метод проверки jQuery в том случае, если по умолчанию он не работает?

попытался добавить это:

jQuery.validator.addMethod("atlestonerequired", function (value, element) {
             return (value != null);
         });

         jQuery.validator.unobtrusive.adapters.addBool('atlestonerequired');

не работает.


person Vasya Pupkin    schedule 31.05.2011    source источник
comment
Я хочу узнать ответ, по одному? :(   -  person Maidot    schedule 01.06.2011
comment
Я тоже ищу решение!   -  person imdadhusen    schedule 18.10.2011


Ответы (2)


Некоторое время потратил на эту проблему. Причина того, что проверка клиента не работает, заключается в том, как ненавязчивая проверка выбирает элементы, которые необходимо проверить. В частности, следующая строка:

$(selector).find(":input[data-val=true]").each(function () {
  $jQval.unobtrusive.parseElement(this, true);
});

если вы заметили ": input", которое относится только к input|select|textarea|button

Это означает, что ваш "div[data-val=true]" не будет выбран.

Способ обойти это - сделать это аналогично требованию для переключателя.

<div name="CheckBox" id="CheckBox">
  <input type="checkbox" data-val-cbrequired="Required" data-val="true" value="Default" name="CheckBox_0" id="CheckBox_0">
  <label for="CheckBox_0">Checkbox</label>
  <input type="checkbox" value="Yes" name="CheckBox_1" id="CheckBox_1">
  <label for="CheckBox_1">Yes</label>
  <input type="checkbox" value="No" name="CheckBox_2" id="CheckBox_2">
  <label for="CheckBox_2">No</label>
</div>

Затем для проверки JQuery добавьте:

$.validator.unobtrusive.adapters.addBool("cbrequired", "required");
person Kumu    schedule 28.02.2012

Я не знаю общепринятого решения этой проблемы. Но здесь есть обходной путь.

У меня есть флажок как:

<input name="TermsNConditions" type="checkbox" id="TermsNConditions" tabindex="12" />

Модель обладает таким свойством:

    [Required(ErrorMessage = "(Please accept the terms and conditions)")]
    [DefaultValue(0)]
    [RegularExpression(@"[^0]", ErrorMessage = "(Please accept the terms and conditions)")]
    public int AcceptTermsNConditions { get; set; }

и скрытое поле для него

<%:Html.HiddenFor(model=>model.AcceptTermsNConditions) %>

Я вызываю событие изменения javascript для флажка, как показано ниже:

$(function () {
        $("#TermsNConditions").live("change", function () {
            if ($("#TermsNConditions").attr('checked')) {
                $("#AcceptTermsNConditions").val(1);
            }
            else {
                $("#AcceptTermsNConditions").val(0);
            }
        });
        if ($("#AcceptTermsNConditions").val() == 1) {
            $("#TermsNConditions").attr('checked', true);
        }
    });

Приведенный выше сценарий устанавливает значение для скрытого поля, и модель проверяется на соответствие этому скрытому полю.

person Sunil Raj    schedule 24.01.2012