Приведение булевого значения модели в истинное значение с помощью аннотаций данных - PullRequest
20 голосов
/ 08 августа 2011

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

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

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

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

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

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

Ответы [ 3 ]

26 голосов
/ 08 августа 2011
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 
            };
        }
    }
}
6 голосов
/ 09 августа 2011

Вы можете написать собственный атрибут проверки, который уже был упомянут.Вам нужно будет написать собственный 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 , чтобы сравнить значение вашего атрибута * AgreementTerms *.Просто да, но мне это не нравится:)

0 голосов
/ 24 мая 2019

На самом деле есть способ заставить его работать с аннотациями данных.Следующим способом:

    [Required]
    [Range(typeof(bool), "true", "true")]
    public bool AcceptTerms { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...