87 votes

L'attribut MaxLength ne génère pas d'attributs de validation côté client

J'ai un curieux problème avec la validation côté client d'ASP.NET MVC3. J'ai la classe suivante :

public class Instrument : BaseObject
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Name is required.")]
    [MaxLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")]
    public string Name { get; set; }
}

De mon point de vue :

<div class="editor-field">
    @Html.EditorFor(model => model.Name)
    @Html.ValidationMessageFor(model => model.Name)
</div>

Et voici le HTML généré que j'obtiens pour la zone de texte de ce champ :

<input class="text-box single-line" data-val="true" data-val-required="Name is required." id="Name" name="Name" type="text" value="">

Aucun signe de la MaxLengthAttribute mais tout le reste semble fonctionner.

Une idée de ce qui ne va pas ?

157voto

Darin Dimitrov Points 528142

Essayez d'utiliser le [StringLength] attribut :

[Required(ErrorMessage = "Name is required.")]
[StringLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")]
public string Name { get; set; }

C'est à des fins de validation. Si vous souhaitez définir, par exemple, l'attribut maxlength sur l'entrée, vous pouvez écrire un fournisseur de métadonnées d'annotations de données personnalisé comme suit présenté dans ce post et personnaliser le Modèles par défaut .

3 votes

Merci beaucoup. Au cas où quelqu'un se poserait la question, j'ai vérifié que EF Code First crée la colonne DB avec la longueur maximale imposée par l'attribut StringLength. :)

0 votes

Mais ce n'est pas la réponse. Parce que l'attribut MinLength ne fonctionne pas non plus

0 votes

@Greg, l'attribut StringLength peut spécifier une longueur maximale et minimale.

37voto

Nick Points 492

Je viens d'utiliser un bout de jquery pour résoudre ce problème.

$("input[data-val-length-max]").each(function (index, element) {
   var length = parseInt($(this).attr("data-val-length-max"));
   $(this).prop("maxlength", length);
});

Le sélecteur trouve tous les éléments dont l'attribut data-val-length-max est défini. Il s'agit de l'attribut que l'attribut de validation StringLength définira.

La boucle each passe en revue ces correspondances et extrait la valeur de cet attribut pour l'affecter à la propriété mxlength qui aurait dû être définie.

Il suffit de l'ajouter à la fonction de préparation des documents et le tour est joué.

1 votes

C'est plutôt habile.

4 votes

Vous pouvez utiliser .data("val-length-max") au lieu de .attr("data-val-length-max") :)

8voto

Michael Logutov Points 632

MaxLengthAttribute fonctionne depuis la mise à jour de MVC 5.1 : notes de modification

14 votes

Cela fonctionne maintenant pour la validation, mais MVC n'applique toujours pas l'approche de l'utilisateur. maxlength de l'attribut input élément.

1 votes

J'ai écrit une extension du cadre qui fait exactement cela @ladenedge

8voto

Dans MVC 4 Si vous voulez une longueur maximale dans le texte du type input ? C'est possible !

@Html.TextBoxFor(model => model.Item3.ADR_ZIP, new { @class = "gui-input ui-oblig", @maxlength = "5" })

4voto

EamonnM Points 701

Bravo à @Nick-Harrison pour sa réponse :

$("input[data-val-length-max]").each(function (index, element) {
var length = parseInt($(this).attr("data-val-length-max"));
$(this).prop("maxlength", length);
});

Je me demandais à quoi servait la fonction parseInt() ? Je l'ai simplifié comme ceci sans problème...

$("input[data-val-length-max]").each(function (index, element) {
    element.setAttribute("maxlength", element.getAttribute("data-val-length-max"))
});

J'aurais bien commenté la réponse de Nicks mais je n'ai pas encore assez de représentants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X