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..
InformationsquelleAutor Jake | 2014-02-25