MVC Model nécessite true

Y a-t-il un moyen, dans 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;} } 

Vous pouvez créer votre propre validateur:

 public class IsTrueAtsortingbute : ValidationAtsortingbute { #region Overrides of ValidationAtsortingbute ///  /// Determines whether the specified value of the object is valid. ///  ///  /// true if the specified value is valid; otherwise, false. ///  /// The value of the specified validation object on which the  is declared. ///  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; } #endregion } 

Je créerais un validateur à la fois du côté serveur et du côté client. En utilisant MVC et la validation de forme non intrusive, ceci peut être réalisé simplement en procédant comme suit:

Tout d’abord, créez une classe dans votre projet pour effectuer la validation côté serveur comme suit:

 public class EnforceTrueAtsortingbute : ValidationAtsortingbute, 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 ssortingng FormatErrorMessage(ssortingng name) { return "The " + name + " field must be checked in order to continue."; } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = Ssortingng.IsNullOrEmpty(ErrorMessage) ? FormatErrorMessage(metadata.DisplayName) : ErrorMessage, ValidationType = "enforcetrue" }; } } 

Ensuite, annotez la propriété appropriée dans votre modèle:

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

Et enfin, activez la validation côté client en ajoutant le script suivant à votre vue:

  

Note: Nous avons déjà créé une méthode GetClientValidationRules qui pousse notre annotation à la vue depuis notre modèle.

Si vous utilisez des fichiers de ressources pour fournir le message d’erreur pour l’internationalisation, supprimez l’appel FormatErrorMessage (ou appelez simplement la base) et GetClientValidationRules méthode GetClientValidationRules comme GetClientValidationRules :

 public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { ssortingng errorMessage = Ssortingng.Empty; if(Ssortingng.IsNullOrWhiteSpace(ErrorMessage)) { // Check if they supplied an error message resource if(ErrorMessageResourceType != null && !Ssortingng.IsNullOrWhiteSpace(ErrorMessageResourceName)) { var resMan = new ResourceManager(ErrorMessageResourceType.FullName, ErrorMessageResourceType.Assembly); errorMessage = resMan.GetSsortingng(ErrorMessageResourceName); } } else { errorMessage = ErrorMessage; } yield return new ModelClientValidationRule { ErrorMessage = errorMessage, ValidationType = "enforcetrue" }; } 

Je sais que c’est un ancien message, mais je voulais partager un simple moyen côté serveur pour ce faire. Vous créez un jeu de propriétés privé sur true et comparez votre bool à cette propriété. Si votre bool n’est pas coché (par défaut faux) le formulaire ne sera pas validé.

 public 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; } 

J’ai essayé plusieurs solutions, mais aucune d’entre elles n’a fonctionné complètement pour que je puisse obtenir à la fois une validation côté client et côté serveur. Donc, ce que j’ai fait dans mon application MVC 5 pour le faire fonctionner:

Dans votre ViewModel (pour la validation côté serveur):

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

Dans votre page Razor (pour la validation côté client):

 
@Html.CheckBoxFor(m => m.HasAcceptedTermsAndConditions) @Html.LabelFor(m => m.HasAcceptedTermsAndConditions) @Html.ValidationMessageFor(m => m.HasAcceptedTermsAndConditions) @Html.Hidden(nameof(Model.IsTrue), "true")

Je voudrais juste diriger les gens vers le violon suivant: https://dotnetfiddle.net/JbPh0X

L’utilisateur a ajouté [Range(typeof(bool), "true", "true", ErrorMessage = "You gotta tick the box!")] sa propriété booléenne, ce qui a pour effet que la validation côté serveur fonctionne.

Pour que la validation côté client fonctionne également, ils ont ajouté le script suivant:

 // extend jquery range validator to work for required checkboxes var defaultRangeValidator = $.validator.methods.range; $.validator.methods.range = function(value, element, param) { if(element.type === 'checkbox') { // if it's a checkbox return true if it is checked return element.checked; } else { // otherwise run the default validation function return defaultRangeValidator.call(this, value, element, param); } } 

Vous pouvez créer votre propre atsortingbut ou utiliser CustomValidationAtsortingbute .

Voici comment vous utiliseriez le CustomValidationAtsortingbute:

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

où BoolValidation est défini comme suit:

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

Il suffit de vérifier si sa représentation de chaîne est égale à True :

 [RegularExpression("True")] public bool TermsAndConditions { get; set; } 

[Required] atsortingbut [Required] signifie exiger n’importe quelle valeur – il peut être vrai ou faux. Vous devriez utiliser une autre validation pour cela.

Avez-vous les éléments appropriés configurés dans le fichier web.config ?

Cela pourrait empêcher la validation de fonctionner.

Vous pouvez également essayer de créer un atsortingbut de validation personnalisé (dans la mesure où [Required] ne se soucie que de savoir s’il existe ou non, et que vous vous souciez de la valeur):

 [AtsortingbuteUsage(AtsortingbuteTargets.Property | AtsortingbuteTargets.Field, AllowMultiple = false)] sealed public class RequiredTrueAtsortingbute : ValidationAtsortingbute { // Internal field to hold the mask value. readonly bool accepted; public bool Accepted { get { return accepted; } } public RequiredTrueAtsortingbute(bool accepted) { this.accepted = accepted; } public override bool IsValid(object value) { bool isAccepted = (bool)value; return (isAccepted == true); } public override ssortingng FormatErrorMessage(ssortingng name) { return Ssortingng.Format(CultureInfo.CurrentCulture, ErrorMessageSsortingng, name, this.Accepted); } } 

Ensuite, utilisation:

 [RequiredTrue(ErrorMessage="{0} requires acceptance to continue.")] public bool Agreement {get; set;} 

De là

Je ne connais pas de moyen via DataAnnotations, mais cela se fait facilement dans votre contrôleur.

 public ActionResult Add(Domain.Something model) { if (!model.MyCheckBox) ModelState.AddModelError("MyCheckBox", "You forgot to click accept"); if (ModelState.IsValid) { //'# do your stuff } } 

La seule autre option serait de créer un validateur personnalisé pour le côté serveur et un validateur distant pour le côté client (la validation à distance est uniquement disponible dans MVC3 +).

Suite au post de ta.speot.is et au commentaire de Jerad Rose:

Le message donné ne fonctionnera pas côté client avec une validation discrète. Cela devrait fonctionner dans les deux camps:

 [RegularExpression("(True|true")] public bool TermsAndConditions { get; set; } 

Je pense que la meilleure façon de gérer cela est de vérifier dans votre contrôleur si la boîte est vraie, sinon ajoutez simplement une erreur à votre modèle et faites-le réafficher votre vue.

Comme indiqué précédemment, tout ce qui est requirejs est de s’assurer qu’il y a une valeur et dans votre cas, si elle n’est pas cochée, vous êtes toujours faux.

/// /// Résumé: -CheckBox pour ou vérification de type d’entrée requirejse validation ne fonctionne pas la cause racine et la solution comme suit /// /// Problème: /// La clé de ce problème réside dans l’interprétation de la validation jQuery ‘ règle obligatoire. J’ai creusé un peu et j’ai trouvé un code spécifique dans un fichier jquery.validate.unobtrusive.js: /// adapters.add (“required”, function (options) {/// if (options.element.tagName.toUpperCase ()) ! == “INPUT” || options.element.type.toUpperCase ()! == “CHECKBOX”) {/// setValidationValues ​​(options, “required”, true); ///} ///}); ///
/// Correction: (Correction du script Jquery au niveau de la page ajoutée à la zone de la case à cocher requirejse) /// 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; ///} /// Correctif: (Code C # pour la validation MVC) /// Vous pouvez voir qu’il hérite de RequiredAtsortingbute commun. De plus, il implémente IClientValidateable C’est pour s’assurer que la règle sera également propagée côté client (validation jQuery).
/// Exemple d’annotation: /// [BooleanRequired] /// bool public iAgree {get; ensemble’ } ///

 public class BooleanRequired : RequiredAtsortingbute, IClientValidatable { public BooleanRequired() { } public override bool IsValid(object value) { return value != null && (bool)value == true; } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { return new ModelClientValidationRule[] { new ModelClientValidationRule() { ValidationType = "brequired", ErrorMessage = this.ErrorMessage } }; } } 

Découvrez la validation infaillible ici . Vous pouvez le télécharger / installer via Nuget.

C’est une super petite bibliothèque pour ce genre de chose.

C’est ce qui a fonctionné pour moi. Rien d’autre n’a fait. Mvc 5:

Modèle

 public ssortingng True { get { return "true"; } } [Required] [Compare("True", ErrorMessage = "Please agree to the Acknowlegement")] public bool Acknowlegement { get; set; } 

Vue

  @Html.HiddenFor(m => m.True) @Html.EditorFor(model => model.Acknowlegement, new { htmlAtsortingbutes = Model.Atsortingbutes }) @Html.ValidationMessageFor(model => model.Acknowlegement, "", new { @class = "text-danger" }) 

entrer la description de l'image ici

entrer la description de l'image ici

Pour ASP.NET Core MVC, voici la validation client et serveur, basée sur la solution de dazbradbury

 public class EnforceTrueAtsortingbute : ValidationAtsortingbute, IClientModelValidator { 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; } public void AddValidation(ClientModelValidationContext context) { MergeAtsortingbute(context.Atsortingbutes, "data-val", "true"); var errorMessage = ErrorMessage ?? $"The value for field {context.ModelMetadata.GetDisplayName()} must be true."; MergeAtsortingbute(context.Atsortingbutes, "data-val-enforcetrue", errorMessage); } private void MergeAtsortingbute(IDictionary atsortingbutes, ssortingng key, ssortingng value) { if (atsortingbutes.ContainsKey(key)) { return; } atsortingbutes.Add(key, value); } } 

Et puis sur le client:

 $.validator.addMethod("enforcetrue", function (value, element, param) { return element.checked; }); $.validator.unobtrusive.adapters.addBool("enforcetrue"); 

Alors l’usage est:

 [EnforceTrue(ErrorMessage = "Please tick the checkbox")] public bool IsAccepted { get; set; }