jQuery Discrète validation côté client de l'attribut personnalisé
J'ai créé une validation personnalisée attribut qui fonctionne côté serveur (après la forme est affiché sur le site) mais je ne peux pas obtenir la validation pour travailler côté client.
L'attribut personnalisé est:
public class ReasonableAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
return Approval.IsNumberReasonable(value.ToString());
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
ModelClientValidationRule rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "reasonable";
yield return rule;
}
}
La IsNumberReasonable()
fonction juste fait quelques vérifications sur les champs d'entrée pour s'assurer qu'ils sont entrés pourrait raisonnablement être un numéro d'Approbation (par exemple, ne sont pas vides, ou "Inconnu" ou quelque chose comme ça) de retour d'un bool true/false
.
Mon Modèle contient:
[Display(Name = "Approval Number"]
[Reasonable(ErrorMessage = "Please enter a reasonable {0}")]
public String ApprovalNumber { get; set; }
et la Vue contient:
@Html.LabelFor(model => model.ApprovalNumber, new { @class = "control-label col-md-3" })
<div class="col-md-9 append field">
@Html.TextBoxFor(model => model.ApprovalNumber, new { @class = "input text" })
@Html.ValidationMessageFor(model => model.ApprovalNumber)
</div>
dans le code JavaScript, j'ai essayé d'ajouter:
$.validator.unobtrusive.adapters.addBool("reasonable", "required");
//OR
$.validator.unobtrusive.adapters.add("reasonable");
et: (à l'extérieur du document.prêt)
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
$.validator.unobtrusive.adapters.addBool('reasonable');
})(jQuery);
dans diverses combinaisons, mais n'ont pas été en mesure de l'obtenir pour fonctionner.
J'ai
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
inclus dans la Vue.
Lorsque le formulaire est soumis, la validation côté client travaille pour les autres champs (obligatoires, ceux-ci etc), mais le message de validation à côté de la ApprovalNumber n'apparaît jamais/ne pas assumer mes validation personnalisée.
Tous les pointeurs dans le bon sens pour être apprécié.
merci.
J'ai aussi
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
</configuration>
Déjà dans le Web.fichier de configuration.
Edit 2:
comme par chenZ post:
Le code html du champ de saisie est:
<input class="input text valid" data-val="true" data-val-reasonable="Please enter a reasonable Approval Number" data-val-required="Approval Number is Required." id="ApprovalNumber" name="ApprovalNumber" type="text" value="">
Essayé la mise à jour du fond de mon point de vue avec:
<script src="~/Scripts/jquery.validate.js"></script>
<script type="text/javascript">
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
})(jQuery);
</script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/Create.js"></script>
où la fin de jquery.validate.unobtrusive.js
contient maintenant:
$(function () {
$.validator.unobtrusive.adapters.addBool('reasonable');
$("#formID").removeData("unobtrusiveValidation").removeData("validator");
$jQval.unobtrusive.parse(document);
});
}(jQuery));
et create.js
contient:
$.validator.unobtrusive.adapters.addBool("mandatory", "required"); //another custom attribute for checkbox validation
var v = $("#formID").validate({
errorClass: "warning",
onkeyup: false,
onblur: false,
});
la v
variable est utilisée plus bas pour le bouton envoyer:
$("#SubmitButton").click(function () {
if (v.form()) {
//The form passed validation so continue..
} else {
//Validation failed, do something else..
}
});
J'ai fait quelques tests supplémentaires sna, il semble être quelque chose à voir avec l':
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
})(jQuery);
quand je l'ai changer pour:
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != 'unknown';
}, 'Clientside Should Not Postback');
})(jQuery);
cela fonctionne, mais seulement si j'ai de type "inconnu" dans la zone de saisie, tout le reste passe.. même si j'ai mis return value != 'jhdsfkhsdkfj';
il valide uniquement lorsque je saisie jhdsfkhsdkfj.
il semble donc que c'est en utilisant ce que la règle? au lieu de mon côté serveur IsNumberReasonable()
fonction.
espoir qui aide à résoudre les problèmes.
- est de $.programme de validation.addMethod ci-dessus réf jq.valider.discret?
- pas 100% sûr de ce que vous voulez dire par là.. Oui?
$.validator.addMethod
et$.validator.messages
ont été utilisés ailleurs dans le JS j'ai donc supposé que c'était la syntaxe de cette..
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas essayé, donc je ne suis pas sûr, mais je pense qu'il y a 2 endroits où vous peut-être tort.
1.la règle.ValidationType = "raisonnable";
Vérifiez votre code html, trouver l'entrée, et est-il un attribut data-val-reasonalbe ou reasonale
dans jquery.validate.unobtrusive.js, la ligne 173, vous pouvez trouver cela, donc ça doit être un data-val-xxxx
2.dans jquery.validate.unobtrusive.js à la fin du fichier, vous pouvez trouver
ainsi, lorsque la page est chargée, tous forment ensemble valider
C'est une chose difficile.
Si votre code est comme
Lorsque vous faire discret.parse(document); la validité de votre méthode raisonnable n'existe pas, et la carte n'existe pas exister, de sorte que votre formulaire valide n'a pas une règle raisonnable
Si vous modifiez le code comme ceci
de la validité de la méthode peut ajouter, mais le $.programme de validation.discret est pas défini
Je pense que vous devriez faire plus
et de mettre le
à jquery.validate.unobtrusive.js et assurez-vous qu'il s'exécute avant
Je ne suis pas sûr si cela va fonctionner, peut-être que je vais essayer plus tard.
J'espère que cela peut vous aider.
mise à jour
Je l'ai essayé.
Au point 2, vous pouvez utiliser le code
Mettre ce code après votre ajouter méthode valable, c'est clair paramètre valide et d'analyser à nouveau avec vos règles personnalisées
mise à jour 2
aussi discrète.parse(...)
jquery.validate.js ligne 41
et jquery.validate.unobtrusive.js ligne 99
quand
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
à la fin de ce fichier, appelé discrète.parse(document), il ajoute des données à la forme.
Si elle a appelé avant de vous de code de configuration, la validation du réglage est sans votre installation.
vous pouvez removeData(...), et d'exécuter discrète.parse(document) par votre code, à nouveau, comme
valider plugin utiliser des données nom de "valideur" et l'utilisation discrète de données nom "unobtrusiveValidation".
Je suis vraiment désolé pour mon mauvais anglais, j'espère que vous pouvez comprendre.
data-val-reasonable
attribut. J'ai essayé ce que vous avez suggéré (mise à jour le post original avec plus d'info) mais il ne fonctionne pas encore à 100%. merci.Ajouter à votre site Web.config
Cool puis essayez de modifier votre règle à utiliser la règle ci-dessous.
Depuis que j'ai débarqué ici lors de la recherche dans ma question, j'aimerais partager avec vous que si vous utilisez un 3ème partie les bibliothèques de contrôles, tels que les DevExpress avec l'option incorporer les bibliothèques clientes, alors ils peuvent se ré-inclure les scripts de validation, ce qui pourrait conduire à votre adaptateur d'être correctement ajoutés ensuite à nouveau perdu. Dans mon cas, j'ai dû passer mon .fichier js de la création de la côté client discrète programme de validation de l'adaptateur vers le bas au-dessous de ces autres délinquance des scripts. Je voudrais aussi voulez envisager de l'abandonner mon propre inclusion de ces fichiers, ou de la configuration de mon 3ème partie de la bibliothèque de ne pas les inclure, pour éviter une telle confusion.