82 votes

Spécifier la longueur maximale d'une zone de texte multiligne

J'essaie d'utiliser asp :

<asp:TextBox ID="txtInput" runat="server" TextMode="MultiLine"></asp:TextBox>

Je veux un moyen de spécifier le maxlength mais apparemment, il n'y a aucun moyen pour qu'une propriété multiline textbox . J'ai essayé d'utiliser un peu de JavaScript pour le onkeypress événement :

onkeypress="return textboxMultilineMaxNumber(this,maxlength)"

function textboxMultilineMaxNumber(txt, maxLen) {
    try {
        if (txt.value.length > (maxLen - 1)) return false;
    } catch (e) { }
    return true;
}

Bien qu'elle fonctionne bien, le problème de cette fonction JavaScript est qu'après avoir écrit les caractères, elle ne vous permet pas de les supprimer ou de les remplacer, ce qui n'est pas souhaité.

Avez-vous une idée de ce que je pourrais changer dans le code ci-dessus pour éviter cela ou d'autres moyens de le contourner ?

2 votes

J'ai essayé toutes les réponses et celle de scottyboiler est certainement la plus proche de la solution idéale. Toutes les autres ont de petits problèmes (ne fonctionnent pas avec le copier-coller, le paramètre MaxLength ne fonctionne pas dans IE, etc).

0 votes

Je soutiens @kape123 ici. Tous les autres ont des défauts. Après tout, nous voulons simplement empêcher le champ de permettre plus que la limite donnée et être capable de copier et coller dans la limite !

1 votes

@Fernando68 Je me suis rendu compte que je n'ai pas lié la réponse - la voici lien vers la solution de scottyboiler qui est la plus proche de l'idée - tous les autres ont des défauts.

75voto

Alex Angas Points 20408

Utilisez un validateur d'expressions régulières à la place. Cela fonctionnera du côté client en utilisant JavaScript, mais aussi lorsque JavaScript est désactivé (car la vérification de la longueur sera également effectuée sur le serveur).

L'exemple suivant vérifie que la valeur saisie est comprise entre 0 et 100 caractères :

<asp:RegularExpressionValidator runat="server" ID="valInput"
    ControlToValidate="txtInput"
    ValidationExpression="^[\s\S]{0,100}$"
    ErrorMessage="Please enter a maximum of 100 characters"
    Display="Dynamic">*</asp:RegularExpressionValidator>

Il existe bien sûr des expressions rationnelles plus complexes que vous pouvez utiliser pour mieux répondre à vos besoins.

1 votes

Le seul problème que je rencontre avec cette réponse est que lorsque l'utilisateur modifie le texte pour le ramener dans la limite, le message ne disparaît pas, ce qui peut être assez déroutant pour l'utilisateur.

0 votes

Si vous optez pour cette solution, je vous recommande également de déclencher la validation à la pression d'une touche, ce qui fait apparaître et disparaître le message au fur et à mesure que l'utilisateur tape : fczaja.blogspot.co.uk/2009/07/

0 votes

Y a-t-il une raison particulière pour laquelle vous utilisez [\s\S] au lieu de la plus simple . ?

43voto

Raúl Roa Points 2477

Essayez ce javascript :

function checkTextAreaMaxLength(textBox,e, length)
{

        var mLen = textBox["MaxLength"];
        if(null==mLen)
            mLen=length;

        var maxLength = parseInt(mLen);
        if(!checkSpecialKeys(e))
        {
         if(textBox.value.length > maxLength-1)
         {
            if(window.event)//IE
              e.returnValue = false;
            else//Firefox
                e.preventDefault();
         }
    }   
}
function checkSpecialKeys(e)
{
    if(e.keyCode !=8 && e.keyCode!=46 && e.keyCode!=37 && e.keyCode!=38 && e.keyCode!=39 && e.keyCode!=40)
        return false;
    else
        return true;
}

Sur le contrôle, invoquez-le comme suit :

<asp:TextBox Rows="5" Columns="80" ID="txtCommentsForSearch" MaxLength='1999' onkeyDown="checkTextAreaMaxLength(this,event,'1999');"  TextMode="multiLine" runat="server"> </asp:TextBox>

Vous pouvez aussi simplement utiliser la fonction checkSpecialKeys pour valider l'entrée dans votre implémentation javascript.

1 votes

C'est très bien, sauf que la limitation échoue lorsque l'utilisateur saisit des retours de chariot. Les retours chariot n'ajoutent rien au compte value.length de javascript mais contribuent à la taille globale de la chaîne (' \n ' est de deux caractères). Si votre serveur limite la taille de la chaîne de caractères, vous obtiendrez toujours une troncature lorsque quelqu'un utilise des retours chariot.

0 votes

Mon dernier commentaire ne semble s'appliquer qu'à certains navigateurs. IE renvoie une valeur de longueur correcte (y compris les caractères de retour chariot). Webkit ne le fait pas.

2 votes

Ce code ne fonctionne pas côté serveur, ce qui en fait une solution assez pauvre. Le validateur regex d'Alex Angas est une bien meilleure solution et devrait vraiment être la réponse acceptée...

22voto

scottyboiler Points 101

Faites votre choix :

function Count(text) 
{
    //asp.net textarea maxlength doesnt work; do it by hand
    var maxlength = 2000; //set your value here (or add a parm and pass it in)
    var object = document.getElementById(text.id)  //get your object
    if (object.value.length > maxlength) 
    {
        object.focus(); //set focus to prevent jumping
        object.value = text.value.substring(0, maxlength); //truncate the value
        object.scrollTop = object.scrollHeight; //scroll to the end to prevent jumping
        return false;
    }
    return true;
}

Appelez comme ça :

<asp:TextBox ID="foo" runat="server" Rows="3" TextMode="MultiLine" onKeyUp="javascript:Count(this);" onChange="javascript:Count(this);" ></asp:TextBox>

0 votes

Pourquoi réinventer la roue ? En quoi est-ce mieux que d'utiliser le mécanisme intégré ? (Réponse d'Alex Angas)

3 votes

@NickG Parce que "cette roue" tourne mieux que les versions en bois ci-dessus ! ;)

0 votes

Je préfère cette solution JavaScript. La solution ci-dessus RegularExpressionValidator peut afficher un problème et nécessiter de modifier le web.config. (Re : stackoverflow.com/questions/16660900/ )

5voto

AlexP Points 60

Il existe un étonnant jQuery SimpleMaxLength plugin

<asp:TextBox ID="txtSpotLightHeader" runat="server" TextMode="MultiLine" />
<script type="text/javascript">
     $(document).ready(function () {
         $("[id$='txtSpotLightHeader']").maxLength(100);
     });
</script>

4voto

Keith K Points 1174

Une autre façon de résoudre ce problème pour les navigateurs (Firefox, Chrome, Safari) qui prennent en charge la longueur maximale des zones de texte (HTML5) sans javascript est de créer une sous-classe de la classe System.Web.UI.WebControls.TextBox et de remplacer la méthode Render. Ensuite, dans cette méthode, ajoutez l'attribut maxlength avant d'effectuer le rendu comme d'habitude.

protected override void Render(HtmlTextWriter writer)
{
    if (this.TextMode == TextBoxMode.MultiLine
        && this.MaxLength > 0)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, this.MaxLength.ToString());
    }

    base.Render(writer);
}

1 votes

Vous pourriez également transformer cette fonction en un ControlAdapter, ce qui vous éviterait de devoir remplacer chaque TextBox par la textbox héritée.

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