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

Приведение логического значения модели в соответствие с аннотациями данных

Простая проблема здесь (я думаю).

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

Я добавил это в мою модель просмотра:

[Required]
[Range(1, 1, ErrorMessage = "You must agree to the Terms and Conditions")]
public bool AgreeTerms { get; set; }

Но это не сработало.

Есть ли простой способ заставить значение быть истинным с аннотациями данных?

4b9b3361

Ответ 1

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace Checked.Entitites
{
    public class BooleanRequiredAttribute : ValidationAttribute, IClientValidatable
    {
        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 = "booleanrequired", ErrorMessage = this.ErrorMessage } };
            yield return new ModelClientValidationRule() 
            { 
                ValidationType = "booleanrequired", 
                ErrorMessage = this.ErrorMessageString 
            };
        }
    }
}

Ответ 2

Вы можете написать специальный атрибут проверки, который уже упоминался. Вам нужно будет написать собственный javascript, чтобы включить ненавязчивую функцию проверки, чтобы поднять ее, если вы выполняете проверку на стороне клиента. например если вы используете jQuery:

// extend jquery unobtrusive validation
(function ($) {

  // add the validator for the boolean attribute
  $.validator.addMethod(
    "booleanrequired",
    function (value, element, params) {

      // value: the value entered into the input
      // element: the element being validated
      // params: the parameters specified in the unobtrusive adapter

      // do your validation here an return true or false

    });

  // you then need to hook the custom validation attribute into the MS unobtrusive validators
  $.validator.unobtrusive.adapters.add(
    "booleanrequired", // adapter name
    ["booleanrequired"], // the names for the properties on the object that will be passed to the validator method
    function(options) {

      // set the properties for the validator method
      options.rules["booleanRequired"] = options.params;

      // set the message to output if validation fails
      options.messages["booleanRequired] = options.message;

    });

} (jQuery));

Другой способ (который немного взломан, и мне это не нравится) заключается в том, чтобы иметь свойство на вашей модели, для которого всегда установлено значение true, а затем используйте CompareAttribute, чтобы сравнить значение вашего атрибута * AgreeTerms *. Просто да, но мне это не нравится:)

Ответ 3

На самом деле есть способ заставить его работать с DataAnnotations. Следующим образом:

    [Required]
    [Range(typeof(bool), "true", "true")]
    public bool AcceptTerms { get; set; }