web-dev-qa-db-fra.com

ASP Valider la validation côté client .NET MVC au niveau de chaque champ

J'utilise ASP .NET MVC 3 avec Data Annotations et le plugin jQuery validate.

Y a-t-il un moyen de marquer qu'un certain champ (ou certaines annotations de données) ne doit être validé que côté serveur?

J'ai un champ de numéro de téléphone avec un plugin de masquage, et le validateur d'expressions régulières devient fou du côté de l'utilisateur. La regex n'est qu'un système de sécurité (au cas où quelqu'un déciderait de pirater la validation javascript), je n'en ai donc pas besoin pour fonctionner côté client. Mais j'aimerais quand même que l'autre validation tourne côté client.

67
Ryan

Je ne suis pas sûr que cette solution fonctionne sur MVC3. Cela fonctionne sûrement sur MVC4:

Vous pouvez simplement désactiver la validation côté client dans la vue Razor avant de restituer le champ et réactiver la validation côté client une fois le champ rendu.

Exemple:

<div class="editor-field">
    @{ Html.EnableClientValidation(false); }
    @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
    @{ Html.EnableClientValidation(true); }
</div>

Ici, nous désactivons la validation côté client pour le champ BatchId.

J'ai aussi développé un petit assistant pour cela:

public static class YnnovaHtmlHelper
{
    public static ClientSideValidationDisabler BeginDisableClientSideValidation(this HtmlHelper html)
    {
        return new ClientSideValidationDisabler(html);
    }
}

public class ClientSideValidationDisabler : IDisposable
{
    private HtmlHelper _html;

    public ClientSideValidationDisabler(HtmlHelper html)
    {
        _html = html;
        _html.EnableClientValidation(false);
    }

    public void Dispose()
    {
        _html.EnableClientValidation(true);
        _html = null;
    }
}

Vous allez l'utiliser comme suit:

<div class="editor-field">
    @using (Html.BeginDisableClientSideValidation()) {
        @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
    }
</div>

Si quelqu'un a de meilleures solutions s'il vous plaît faites le moi savoir!

J'espère que cette aide.

98
Lorenzo Melato

Vous pouvez désactiver la validation discrète côté client pour un seul champ en ajoutant un attribut data-val='false':

@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" })

Cela remplacera l'attribut data-val='true' ajouté par MVC en raison de l'un quelconque des attributs System.ComponentModel.DataAnnotations. L'élément HTML sera toujours décoré avec d'autres attributs de validation (par exemple, data-val-required) mais ils n'auront aucun effet.

( Notez le trait de soulignement dans data_val ci-dessus. MVC convertit automatiquement les traits de soulignement en traits d'union dans les propriétés de type anonyme, donc data_val devient data-val lors du rendu du code HTML)

79
Ross McNab

MVC5 utilise jquery.validate

http://jqueryvalidation.org/rules/

Si vous souhaitez supprimer les validations dans MVC5 côté client, vous devez procéder comme suit:

Supprimer toutes les validations sur 'myinput'

$("#myinput").rules("remove");

Validations spécifiques

$("#myinput").rules("remove", "min max" );

Lister les validations peut aider

$("#myinput").rules();

Ensuite vous devrez corriger votre code derrière pour valider votre modèle manuellement ou différemment car ModelState.IsValid sera faux Utiliser ModelState.Clear() et TryValidateModel peut alors être pratique.

Modifier:

La désactivation du contrôle supprime également les validations.

$("#myinput").attr('disabled', disabledValue);
18
Guish

En supposant que vous utilisiez la validation non intrusive par défaut, vous pouvez utiliser du javascript pour supprimer les règles côté client. Jetez un oeil à Plugins/Validation/rules

7
archil

Pour atteindre cet objectif dans le scénario donné, nous devons faire deux ajustements.

Côté client

Pour désactiver la validation côté client, nous devons la désactiver de force.

@Html.EditorFor(model => model.Password, new { htmlAttributes = new {  @data_val = "false" , @class = "form-control"} })

Notez le @ data_val = “false”. Cela désactivera la validation sur ce champ.

Côté serveur (en action)

Lorsque le modèle est validé sur l'action post, ModelState.IsValid renvoie toujours false, car le mot de passe n'est pas fourni. Ici, nous devons fournir le mot de passe actuel au modèle et valider à nouveau le modèle.

var userObj = db.Users_Info.Where(a => a.Id == users_Info.Id).FirstOrDefault();
if (String.IsNullOrEmpty(users_Info.Password))
{
  users_Info.Password = userObj.Password;
}
ModelState.Clear();
TryValidateModel(users_Info);

Laissez-moi vous expliquer, d’abord nous récupérons les informations actuelles sauvegardées dans la base de données que nous utiliserons plus tard pour attribuer au modèle actuel si aucun mot de passe n’est fourni. En réalité, les deux dernières lignes réinitialisent ModelState pour renvoyer le résultat mis à jour sur ModelState.IsValid.

4
The Angry Coder

J'ai eu des problèmes avec data_val = "true". Une séquence de boutons radio était liée à une propriété unique dans mon modèle. La validation des données n'a fonctionné que lorsque j'ai appliqué data_val = "true" à l'appel first @ Html.RadioButtonFor.

En déboguant ceci, j'ai découvert que vous pouvez également désactiver ou modifier des règles individuelles côté client en utilisant data_rule _ ??. Les règles se trouvent dans la page/validation de jquery documentation

par exemple;

@Html.RadioButtonFor(m => m.Answer, "Yes", new { data_rule_Required = "false" });
@Html.TextBoxFor(m => m.Answer, new { data_rule_minlength = "10" }
1
Peter Henry

Si vous souhaitez supprimer les validations dans MVC5 côté client, vous devez procéder comme suit:

$("#Email").rules("remove", {
                        "required",
                        "minlength",
                        "email"                           
                        }
                    });
0
Mantu