2013-09-06 4 views
0

J'essaie d'obtenir une règle personnalisée "mustbetrue" fonctionnant. Basé librement sur this question: Mon problème est que lorsque je soumets le formulaire, la validation côté client ne me donne pas une erreur (ne fait pas apparaître le texte de validation). En outre, j'ai mis un point d'arrêt dans la méthode de validation jscript et il ne se déclenche jamais. Le code de mise en ligne qui ajoute l'adaptateur est. Pas d'erreurs dans la console.Asp.Net MVC et validation discrète personnalisée

Qu'est-ce que je fais mal?

C'est ce que j'ai côté serveur:

public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable 
{ 
    public override bool IsValid(object value) 
    { 
     if (value == null) return false; 
     try 
     { 
      return Convert.ToBoolean(value); 
     } 
     catch (InvalidCastException) 
     { 
      return false; 
     } 
    } 

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

et

public class MustBeTrueAttributeAdapter : DataAnnotationsModelValidator<MustBeTrueAttribute> 
{ 
    public MustBeTrueAttributeAdapter(ModelMetadata metadata, ControllerContext context, MustBeTrueAttribute attribute) 
     : base(metadata, context, attribute) 
    { 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     return new[] { new ModelClientValidationMustBeTrueRule(ErrorMessage) }; 
    } 
} 

public class ModelClientValidationMustBeTrueRule : ModelClientValidationRule 
{ 
    public ModelClientValidationMustBeTrueRule(string errorMessage) 
    { 
     ErrorMessage = errorMessage; 
     ValidationType = "mustbetrue"; 
    } 
} 

et dans le global.asax

protected void Application_Start() 
    { 
     // stuff 
     DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MustBeTrueAttribute), typeof(MustBeTrueAttributeAdapter)); 
     // stuff 
    } 

et sur l'objet:

[MustBeTrue(ErrorMessageResourceName = "Register_TermsNotAccepted", ErrorMessageResourceType = typeof(Resources.Global))] 
public bool AcceptedTerms { get; set; } 

côté client:

$(document).ready(function() { 
    jQuery.validator.addMethod("mustbetrue", function (value, element) { 
     if (!this.depend(param, element)) 
      return "dependency-mismatch"; 
     return element.checked; 
    }); 
    jQuery.validator.unobtrusive.adapters.addBool("mustbetrue", "mustbetrue"); 
}); 

et le code HTML pertinent qui est sortie:

<input data-val="true" data-val-mustbetrue="You must accept the terms and conditions" data-val-required="The AcceptedTerms field is required." id="AcceptedTerms" name="AcceptedTerms" type="checkbox" value="true" class="valid"> 
+0

ne pas écarter de l'objectif global, mais n'est pas assez 'required' sur une case à cocher? Les cases à cocher non cochées ne sont pas envoyées à travers le fil, sont-elles (appliquant donc 'Required')? –

+0

Oui J'ai entendu des gens dire que cela fonctionne sans avoir à ajouter une nouvelle règle. Cependant, en pratique, je n'ai jamais réussi à le faire fonctionner. Même avec la combinaison de min max ajoutée à 1 ou 4. – Quibblesome

+0

@Brad Puisqu'un booléen non nul aurait toujours une valeur, False ou True, alors il satisfera toujours l'attribut Required. Ce qui est nécessaire ici n'est pas un attribut Required, mais une validation qui garantit qu'il correspond à une certaine valeur. Obligatoire vérifie simplement si une valeur est présente ou non, mais ne se soucie pas de savoir si cette valeur est 0, 1, true, false, etc. – AaronLS

Répondre

1

Si vous avez déjà vérifié que la validation client est activée (dans la configuration ou dans le code), alors je suppose que est parce que vous ajoutez votre carte après scripts de validation discrète html parse see my answer here for details and possible options

Questions connexes