Подтвердить что ты не робот

Неверная проверка MVC на флажке не работает

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

Это код валидатора на стороне сервера, я добавил:

/// <summary>
/// Validation attribute that demands that a boolean value must be true.
/// </summary>
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }
}

Это модель

[MustBeTrue(ErrorMessage = "You must accept the terms and conditions")]
[DisplayName("Accept terms and conditions")]
public bool AcceptsTerms { get; set; }

Это мое мнение:

@Html.EditorFor(x => x.AcceptTermsAndConditions)
@Html.LabelFor(x => x.AcceptTermsAndConditions)
@Html.ValidationMessageFor(x => x.AcceptTermsAndConditions)

и это jQuery, который я использовал для присоединения клиентской стороны валидатора:

$.validator.unobtrusive.adapters.addBool("mustbetrue", "required");

Клиентская сторона script, похоже, не работает. Всякий раз, когда я нажимаю кнопку "Отправить", проверка на других полях отлично работает, но проверка условий и условий, похоже, не срабатывает. Вот как выглядит код в Firebug после того, как я нажал кнопку отправки.

<input type="checkbox" value="true" name="AcceptTermsAndConditions" id="AcceptTermsAndConditions" data-val-required="The I confirm that I am authorised to join this website and I accept the terms and conditions field is required." data-val="true" class="check-box">
<input type="hidden" value="false" name="AcceptTermsAndConditions">
<label for="AcceptTermsAndConditions">I confirm that I am authorised to join this website and I accept the terms and conditions</label>
<span data-valmsg-replace="true" data-valmsg-for="AcceptTermsAndConditions" class="field-validation-valid"></span>

Любые идеи? Я пропустил шаг? Это заставляет меня горсть!

Спасибо заранее S

4b9b3361

Ответ 1

Наркоман,

В дополнение к реализации решения Darin вам также необходимо изменить файл jquery.validate.unobtrusive.js. В этом файле вы должны добавить метод проверки "mustbetrue" следующим образом:

$jQval.addMethod("mustbetrue", function (value, element, param) {
    // check if dependency is met
    if (!this.depend(param, element))
        return "dependency-mismatch";
    return element.checked;
});

Затем (я забыл добавить это сначала), вы также должны добавить следующее в jquery.validate.unobtrusive.js:

adapters.add("mustbetrue", function (options) {
    setValidationValues(options, "mustbetrue", true);
});

counsellorben

Ответ 2

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

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "mustbetrue"
        };
    }
}

UPDATE:

Полный рабочий пример.

Модель:

public class MyViewModel
{
    [MustBeTrue(ErrorMessage = "You must accept the terms and conditions")]
    [DisplayName("Accept terms and conditions")]
    public bool AcceptsTerms { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

Вид:

@model MyViewModel

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
    $.validator.unobtrusive.adapters.addBool("mustbetrue", "required");
</script>

@using (Html.BeginForm())
{
    @Html.CheckBoxFor(x => x.AcceptsTerms)
    @Html.LabelFor(x => x.AcceptsTerms)
    @Html.ValidationMessageFor(x => x.AcceptsTerms)
    <input type="submit" value="OK" />
}

Ответ 3

Я не уверен, почему это не сработало для меня, но я решил использовать ваш код и сделать что-то немного другое.

На моей загрузке javascript я добавляю следующее: это делает флажок с помощью незаметной проверки, если вы установите флажок и снимите флажок. Кроме того, если вы отправляете форму.

$(function () {
        $(".checkboxonblurenabled").change(function () {
            $('form').validate().element(this);
        });
});

Вам также необходимо добавить класс CSS в свой флажок, например.

@Html.CheckBoxFor(model => model.AgreeToPrivacyPolicy, new { @class = "checkboxonblurenabled"})

Итак, теперь нам нужно подключить модель и ввести класс, чтобы обрабатывать проверку на стороне сервера (которую я повторно использую сверху), но слегка изменяя ненавязчивость.

Вот атрибут клиента, который расширяет IClientValidate, как в приведенном выше примере...

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "mustbetrue"
        };
    }
}

В вашей модели свойство объекта задает требуемые атрибутные обозначения

 [MustBeTrue(ErrorMessage = "Confirm you have read and agree to our privacy policy")]
    [Display(Name = "Privacy policy")]
    public bool AgreeToPrivacyPolicy { get; set; }

Хорошо, мы готовы вставить javascript.

(function ($) {
    /*
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    */
    jQuery.validator.unobtrusive.adapters.add("mustbetrue", ['maxint'], function (options) {
        options.rules["mustbetrue"] = options.params;
        options.messages["mustbetrue"] = options.message;
    });

    jQuery.validator.addMethod("mustbetrue", function (value, element, params) {

        if ($(element).is(':checked')) {
            return true;
        }
        else {
            return false;
        }
    });
    /*
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    */



} (jQuery));

Что делает эту работу, это... хорошо. Посмотрев на разметку HTML после того, как вы попытались сделать предлагаемый ответ выше, мои значения были установлены как true, однако мой флажок был ложным. Итак, я решил позволить jquery работать с IsChecked

Надеюсь, что это поможет.

Ответ 4

Для тех, кто не работает ни одним из этих решений:

Я работаю с Razor MVC 4, используя .NET Framework 4, и последние jquery проверяют файлы script.

После реализации проверки пользовательского атрибута на стороне клиента и сервера он все равно не работает. Моя форма в любом случае должна быть.

Итак, вот улов: JQuery validate script имеет настройку по умолчанию игнорировать скрытые теги, где hidden http://api.jquery.com/hidden-selector/, это не будет проблемой, но @Стиль Html.CheckBoxFor, который я использую, настраивается с помощью стиля CSS3, который изменяет отображение на none и отображается пользовательский образ этого флажка, поэтому он никогда не будет выполнять правило проверки флажка.

Мое обходное решение добавляло эту строку перед объявлением правила пользовательской проверки клиента:

$.validator.defaults.ignore = "";

то, что он делает, переопределяет параметр игнорирования для всех проверок на текущей странице, обратите внимание, что теперь он может также выполнять проверки на скрытом поле (побочный эффект).

Ответ 5

<script>
    $(function () {
        $('#btnconfirm').click(function () {
            if ($("#chk").attr('checked') !== undefined ){
                return true;
            }
            else {

                alert("Please Select Checkbox ");
                return false;
            }
        });

    });
</script>
<div style="float: left">
                    <input type="checkbox" name="chk" id="chk"  />
                    I read and accept the terms and Conditions of registration
                </div>
  <input type="submit" value="Confirm"  id="btnconfirm" />

Ответ 6

 /// <summary> 
    ///  Summary : -CheckBox for or input type check required validation is not working the root cause and solution as follows
    ///
    ///  Problem :
    ///  The key to this problem lies in interpretation of jQuery validation 'required' rule. I digged a little and find a specific code inside a jquery.validate.unobtrusive.js file:
    ///  adapters.add("required", function (options) {
    ///  if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
    ///    setValidationValues(options, "required", true);
    ///    }
    ///   });
    ///   
    ///  Fix: (Jquery script fix at page level added in to check box required area)
    ///  jQuery.validator.unobtrusive.adapters.add("brequired", function (options) {
    ///   if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
    ///              options.rules["required"] = true;
    ///   if (options.message) {
    ///                   options.messages["required"] = options.message;
    ///                       }
    ///  Fix : (C# Code for MVC validation)
    ///  You can see it inherits from common RequiredAttribute. Moreover it implements IClientValidateable. This is to make assure that rule will be propagated to client side (jQuery validation) as well.
    ///  
    ///  Annotation example :
    ///   [BooleanRequired]
    ///   public bool iAgree { get; set' }
    ///    

    /// </summary>


public class BooleanRequired : RequiredAttribute, IClientValidatable
{

    public BooleanRequired()
    {
    }

    public override bool IsValid(object value)
    {
        return value != null && (bool)value == true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new ModelClientValidationRule[] { new ModelClientValidationRule() { ValidationType = "brequired", ErrorMessage = this.ErrorMessage } };
    }
}