93 votes

Modèle MVC nécessite true

Existe-t-il un moyen via les annotations de données d'exiger qu'une propriété booléenne soit définie sur true?

 public class MyAwesomeObj{
    public bool ThisMustBeTrue{get;set;}
}
 

131voto

dazbradbury Points 2483

Je voudrais créer un validateur pour à la fois côté Serveur ET Client. En utilisant MVC et discrète de la validation du formulaire, cela peut être réalisé simplement en procédant de la manière suivante:

Tout d'abord, créer une classe dans votre projet pour effectuer le côté serveur de validation de la sorte:

public class EnforceTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
        return (bool)value == true;
    }

    public override string FormatErrorMessage(string name)
    {
        return "The " + name + " field must be checked in order to continue.";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = String.IsNullOrEmpty(ErrorMessage) ? FormatErrorMessage(metadata.DisplayName) : ErrorMessage,
            ValidationType = "enforcetrue"
        };
    }
}

Suite à cela, d'annoter la propriété appropriée dans votre modèle:

[EnforceTrue(ErrorMessage=@"Error Message")]
public bool ThisMustBeTrue{ get; set; }

Et Enfin, permettre la validation côté client en ajoutant le script suivant à votre Vue:

<script type="text/javascript">
    jQuery.validator.addMethod("enforcetrue", function (value, element, param) {
        return element.checked;
    });
    jQuery.validator.unobtrusive.adapters.addBool("enforcetrue");
</script>

Remarque: Nous avons déjà créé une méthode GetClientValidationRules qui pousse notre commentaire à la vue de notre modèle.

98voto

fields.cage Points 805

Je sais que ceci est un ancien billet mais je voulais partager un moyen simple de le faire côté serveur. Vous créez une propriété privée définie sur true et comparez votre valeur booléenne à cette propriété. Si votre booléen n'est pas coché (par défaut, faux), le formulaire ne sera pas validé.

 private bool isTrue
{ get { return true; } }

[Required]
[Display(Name = "I agree to the terms and conditions")]
[Compare("isTrue", ErrorMessage = "Please agree to Terms and Conditions")]
public bool iAgree { get; set; }
 

53voto

HackedByChinese Points 18294

Vous pouvez créer votre propre validateur:

 public class IsTrueAttribute : ValidationAttribute
{
    #region Overrides of ValidationAttribute

    /// <summary>
    /// Determines whether the specified value of the object is valid. 
    /// </summary>
    /// <returns>
    /// true if the specified value is valid; otherwise, false. 
    /// </returns>
    /// <param name="value">The value of the specified validation object on which the <see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"/> is declared.
    ///                 </param>
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");

        return (bool) value == true;
    }

    #endregion
}
 

5voto

Matthew Manela Points 9610

Vous pouvez créer votre propre attribut ou utiliser le CustomValidationAttribute .

Voici comment vous utiliseriez le CustomValidationAttribute:

 [CustomValidation(typeof(BoolValidation), "ValidateBool")]
 

où BoolValidation est défini comme:

 public class BoolValidation
{
  public static ValidationResult ValidateBool(bool boolToBeTrue)
  {
    if (boolToBeTrue)
    {
      return ValidationResult.Success;
    }
    else
    {
      return new ValidationResult(
          "Bool must be true.");
    }
  }
 

5voto

Sergey Kudriavtsev Points 6090

[Required] attribut signifie exiger n'importe quelle valeur - elle peut être vraie ou fausse. Vous devrez utiliser une autre validation pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X