Frage

Ich versuche ASP zu verwenden:

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

Ich möchte eine Möglichkeit, die anzugeben maxlength Eigentum, aber anscheinend ist es für a auf keinen Fall möglich multiline textbox. Ich habe versucht, JavaScript für die zu verwenden onkeypress Veranstaltung:

onkeypress="return textboxMultilineMaxNumber(this,maxlength)"

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

Während das Problem mit dieser JavaScript -Funktion gut funktioniert, ist dieses Verhalten nach dem Schreiben von Zeichen nicht gewünscht.

Haben Sie eine Idee, was ich möglicherweise im obigen Code ändern könnte, um diese oder andere Möglichkeiten zu vermeiden, um es umzugehen?

War es hilfreich?

Lösung

Probieren Sie dieses JavaScript aus:

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;
}

Auf der Kontrolle rufen es so ein:

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

Sie können auch nur die Funktion CheckSpecialKeys verwenden, um die Eingabe für Ihre JavaScript -Implementierung zu validieren.

Andere Tipps

Verwenden ein Regelmäßiger Ausdruck Validator stattdessen. Dies funktioniert auf der Client -Seite mit JavaScript, aber auch, wenn JavaScript deaktiviert ist (wie die Längenprüfung auch auf dem Server durchgeführt wird).

Das folgende Beispiel prüft, ob der eingegebene Wert zwischen 0 und 100 Zeichen lang ist:

<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>

Es gibt natürlich komplexere Regexs, mit denen Sie Ihren Zwecken besser entsprechen können.

halte es einfach. Die meisten modernen Browser unterstützen ein MaxLength-Attribut in einem Textbereich (dh enthalten). Fügen Sie also einfach dieses Attribut in Code-Behind hinzu. Kein JS, kein JQuery, kein Erbe, benutzerdefinierte Code, keine Aufregung, keine Muss.

Vb.net:

fld_description.attributes("maxlength") = 255

C#

fld_description.attributes["maxlength"] = 255

Roll deinen eigenen:

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;
}

Rufen Sie so an:

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

Eine andere Möglichkeit, dies für diese Browser (Firefox, Chrome, Safari) zu beheben, die MaxLength auf Textareas (HTML5) ohne JavaScript unterstützen, besteht darin, eine Unterklasse des Systems abzuleiten. Fügen Sie dann in der überschriebenen Methode das MaxLength -Attribut hinzu, bevor Sie sie normal machen.

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

    base.Render(writer);
}

Die Dinge haben sich in HTML5 geändert:

ASPX:

<asp:TextBox ID="txtBox" runat="server" maxlength="2000" TextMode="MultiLine"></asp:TextBox>

C#:

if (!IsPostBack)
{
    txtBox.Attributes.Add("maxlength", txtBox.MaxLength.ToString());
}

Rendered HTML:

<textarea name="ctl00$DemoContentPlaceHolder$txtBox" id="txtBox" maxlength="2000"></textarea>

Die Metadaten für Attributes:

Zusammenfassung: Erhält die Sammlung willkürlicher Attribute (nur zum Rendern), die nicht den Eigenschaften der Steuerung entsprechen.

Rückkehr: a System.Web.UI.AttributeCollection von Namen und Wertpaaren.

Verwenden Sie benutzerdefiniertes Attribut maxSize = "100"

<asp:TextBox ID="txtAddress" runat="server"  maxsize="100"
      Columns="17" Rows="4" TextMode="MultiLine"></asp:TextBox>
   <script>
       $("textarea[maxsize]").each(function () {
         $(this).attr('maxlength', $(this).attr('maxsize'));
         $(this).removeAttr('maxsize'); 
       });
   </script>

Dies wird so rendern

<textarea name="ctl00$BodyContentPlac
eHolder$txtAddress" rows="4" cols="17" id="txtAddress" maxlength="100"></textarea>
$('#txtInput').attr('maxLength', 100);

Verwenden Sie HTML TextArea mit runat="server" um auf der Serverseite darauf zugreifen. Diese Lösung hat weniger Schmerzen als JavaScript oder Regex.

<textarea runat="server" id="txt1" maxlength="100" />

Hinweis: Zu Zugang Text Eigenschaft auf der Serverseite sollten Sie verwenden txt1.Value Anstatt von txt1.Text

Ich habe verschiedene Ansätze ausprobiert, aber jeder hatte einige Schwachpunkte (dh mit Schnitt- und Einfügen oder Browserkompatibilität). Dies ist die Lösung, die ich gerade verwende:

function multilineTextBoxKeyUp(textBox, e, maxLength) {
    if (!checkSpecialKeys(e)) {
        var length = parseInt(maxLength);
        if (textBox.value.length > length) {
            textBox.value = textBox.value.substring(0, maxLength);
        }
    }
}

function multilineTextBoxKeyDown(textBox, e, maxLength) {
    var selectedText = document.selection.createRange().text;
    if (!checkSpecialKeys(e) && !e.ctrlKey && selectedText.length == 0) {
        var length = parseInt(maxLength);
        if (textBox.value.length > length - 1) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            else {
                e.returnValue = false;
            }
        }
    }
}

function checkSpecialKeys(e) {
    if (e.keyCode != 8 && e.keyCode != 9 && e.keyCode != 33 && e.keyCode != 34 && e.keyCode != 35 && e.keyCode != 36 && e.keyCode != 37 && e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40) {
        return false;
    } else {
        return true;
    }
}

In diesem Fall rufe ich MultilinextBoxKeyUp auf Key Up und MultilinextBoxKeydown auf Key Down auf:

myTextBox.Attributes.Add("onkeyDown", "multilineTextBoxKeyDown(this, event, '" + maxLength + "');");
myTextBox.Attributes.Add("onkeyUp", "multilineTextBoxKeyUp(this, event, '" + maxLength + "');");

Sich ansehen Dies. Die einzige Möglichkeit, es zu lösen, ist von JavaScript, wie Sie es ausprobiert haben.

BEARBEITEN:Versuchen Sie, das Ereignis in Schlüsseldruck zu ändern.

Das folgende Beispiel in JavaScript/jQuery wird dies tun.

<telerik:RadScriptBlock ID="RadScriptBlock1" runat="server">
<script type="text/javascript">
     function count(text, event) {

         var keyCode = event.keyCode;

         //THIS IS FOR CONTROL KEY
         var ctrlDown = event.ctrlKey;

         var maxlength = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val().length;

         if (maxlength < 200) {
             event.returnValue = true;
         }
         else {

             if ((keyCode == 8) || (keyCode == 9) || (keyCode == 46) || (keyCode == 33) || (keyCode == 27) || (keyCode == 145) || (keyCode == 19) || (keyCode == 34) || (keyCode == 37) || (keyCode == 39) || (keyCode == 16) || (keyCode == 18) ||
                 (keyCode == 38) || (keyCode == 40) || (keyCode == 35) || (keyCode == 36) || (ctrlDown && keyCode == 88) || (ctrlDown && keyCode == 65) || (ctrlDown && keyCode == 67) || (ctrlDown && keyCode == 86)) 

                  {
                 event.returnValue = true;
                  }

             else {

                 event.returnValue = false;
             }
         }

     }

     function substr(text)
      {
          var txtWebAdd = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val();
          var substrWebAdd;
          if (txtWebAdd.length > 200) 
          {                 
              substrWebAdd = txtWebAdd.substring(0, 200);                                  
              $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val('');
              $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val(substrWebAdd); 

          }
     }                  

Dieser Snippet hat in meinem Fall funktioniert. Ich suchte nach der Lösung und dachte darüber nach, dies zu schreiben, damit sie jedem zukünftigen Leser helfen kann.

ASP

<asp:TextBox ID="tbName" runat="server" MaxLength="250" TextMode="MultiLine" onkeyUp="return CheckMaxCount(this,event,250);"></asp:TextBox>

Java -Skript

function CheckMaxCount(txtBox,e, maxLength)
{
    if(txtBox)
    {  
        if(txtBox.value.length > maxLength)
        {
            txtBox.value = txtBox.value.substring(0, maxLength);
        }
        if(!checkSpecialKeys(e))
        {
            return ( txtBox.value.length <= maxLength)
        }
    }
}

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;
}

@Raúl Roa Antwort hat bei Kopie/Einfügen bei mir funktioniert. Währenddessen.

$("textarea[maxlength]").on("keydown paste", function (evt) {
            if ($(this).val().length > $(this).prop("maxlength")) {
                if (evt.type == "paste") {
                    $(this).val($(this).val().substr(0, $(this).prop("maxlength")));
                } else {
                    if ([8, 37, 38, 39, 40, 46].indexOf(evt.keyCode) == -1) {
                        evt.returnValue = false;
                        evt.preventDefault();
                    }
                }
            }
        });

So haben wir es gemacht (hält alle Code an einem Ort):

<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"/>
<% TextBox1.Attributes["maxlength"] = "1000"; %>

Nur für den Fall, dass jemand immer noch WebForms im Jahr 2018 verwendet.

Sie können die maximale Länge für das Multiline Textbox im Pageload -JavaScript -Ereignis angeben

function pageLoad(){
                     $("[id$='txtInput']").attr("maxlength","10");
                    }

Ich habe die maximale Länge Eigenschaft von festgelegt txtinput Multiline Textbox zu 10 Zeichen in Pageload () JavaScript -Funktion

Dies ist dasselbe wie die Antwort von @Keithk, aber mit ein paar weiteren Details. Erstellen Sie zunächst ein neues Steuerelement basierend auf Textbox.

using System.Web.UI;
using System.Web.UI.WebControls;

namespace MyProject
{
    public class LimitedMultiLineTextBox : System.Web.UI.WebControls.TextBox
    {
        protected override void Render(HtmlTextWriter writer)
        {
            this.TextMode = TextBoxMode.MultiLine;

            if (this.MaxLength > 0)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, this.MaxLength.ToString());
            }

            base.Render(writer);
        }
    }
}  

Beachten Sie, dass der obige Code den Textmodus immer auf Multiline legt.

Um dies zu verwenden, müssen Sie es auf der ASPX -Seite registrieren. Dies ist erforderlich, da Sie es mit dem TagPrefix referenzieren müssen, andernfalls beschweren sich die Kompilierung über benutzerdefinierte generische Steuerelemente.

<%@ Register Assembly="MyProject" Namespace="MyProject" TagPrefix="mp" %>

<mp:LimitedMultiLineTextBox runat="server" Rows="3" ...

Fast alle modernen Browser unterstützen jetzt die Verwendung des MaxLength -Attributs für TextArea -Elemente.(https://caniuse.com/#feat=maxLength)

Um das MaxLength -Attribut in ein Multiline -Textfeld aufzunehmen, können Sie einfach die Attribute -Sammlung im Code dahinter wie SO ändern:

txtTextBox.Attributes["maxlength"] = "100";

Wenn Sie den Code dahinter nicht verwenden möchten, um dies anzugeben, können Sie einfach ein benutzerdefiniertes Steuerelement erstellen, das aus dem Textfeld stammt:

public class Textarea : TextBox
{
    public override TextBoxMode TextMode
    {
        get { return TextBoxMode.MultiLine; }
        set { }
    }

    protected override void OnPreRender(EventArgs e)
    {
        if (TextMode == TextBoxMode.MultiLine && MaxLength != 0)
        {
            Attributes["maxlength"] = MaxLength.ToString();
        }

        base.OnPreRender(e);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top