2009-08-26 25 views
68

estoy tratando de utilizar asp:Especificación maxlength de cuadro de texto de varias líneas

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

Quiero una forma de especificar la propiedad maxlength, pero al parecer no hay manera posible para un multiline textbox. He estado tratando de usar algo de JavaScript para la onkeypress evento:

onkeypress="return textboxMultilineMaxNumber(this,maxlength)" 

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

Mientras trabajaba bien el problema con esta función de JavaScript es que después de escribir caracteres que no le permite eliminar y sustituir cualquiera de ellos, que comportamiento no es deseado.

¿Tiene alguna idea de lo que podría cambiar en el código anterior para evitar esa u otras formas de evitarlo?

+1

Intenté todas las respuestas y respuestas de scottyboiler definitivamente es la solución más cercana a la ideal. Todos los demás tienen pequeños problemas (no funcionan con copiar y pegar, el parámetro MaxLength no funciona en IE, etc.). – kape123

+0

I segundo @ kape123 aquí. Todos los demás tienen fallas. ¡Después de todo, solo queremos evitar que el campo permita más que el límite otorgado y poder copiar y pegar dentro del límite! – Fandango68

+1

@ Fernando68 Me he dado cuenta de que no he vinculado la respuesta: aquí está [el enlace a la solución scottyboiler que está más cerca de la idea] (http://stackoverflow.com/a/5501813/237858) - todos los demás tienen algunas fallas. – kape123

Respuesta

41

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

En el mando a invocar esta manera:

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

También puedes, simplemente utilizar los checkSpecialKeys funcionan para validar la entrada de la implementación de Javascript.

+1

Esto es genial, excepto que la limitación falla cuando el usuario ingresa retornos de carro. Los retornos de carro no agregan nada al recuento value.length de JavaScript, pero sí contribuyen al tamaño total de la cadena ('\ n' es dos caracteres). Si su servidor está limitando el tamaño de la cadena, seguirá recibiendo el truncamiento siempre que alguien use retornos de carro. –

+0

Mi último comentario solo parece aplicarse a ciertos navegadores. IE devuelve un valor de longitud adecuado (incluidos los caracteres de retorno de carro). Webkit no. –

+24

Esto no funciona si solo pega una gran cantidad de texto. – Jamie

1

Eche un vistazo a this. La única forma de resolverlo es javascript como lo has intentado.

EDITAR: Intente cambiar el evento a la pulsación de la tecla.

19

liar:

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

llamada así:

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

¡Las manijas cortan y pegan! – user467384

+0

¿Por qué reinventar la rueda? ¿Cómo es esto mejor que usar el mecanismo incorporado? (Respuesta de Alex Angas) – NickG

+2

@NickG ¡Porque 'esta rueda' gira mejor que las versiones de madera de arriba! ;) – Fandango68

2
$('#txtInput').attr('maxLength', 100); 
+0

Tiene votos abajo ya que no funciona. No tiene ningún efecto y aún puede escribir más de 100 caracteres. Eso hace que la respuesta sea inútil, de ahí todos los votos a la baja. – NickG

+1

+1 Esto puede no haber funcionado en HTML 4.01 pero funciona en HTML 5 con la introducción del atributo ['maxlength'] (http://www.w3schools.com/tags/att_textarea_maxlength.asp). –

72

Utilice un validador expresión regular lugar. Esto funcionará en el lado del cliente usando JavaScript, pero también cuando JavaScript esté desactivado (ya que la verificación de la longitud también se realizará en el servidor).

el siguiente ejemplo se comprueba que el valor introducido es entre 0 y 100 caracteres de longitud:

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

Por supuesto, hay más compleja regexs se pueden utilizar para adaptarse mejor a sus propósitos.

+2

limitación tonta de 6 caracteres mientras edito la publicación no puede permitirme corregir el desajuste en expresiones regulares y mensaje de error - debe haber "Por favor ingrese un máximo de _100_ caracteres" – Vladislav

+1

El único problema que tengo con esta respuesta es que cuando el usuario edita la texto para llevarlo dentro del límite, el mensaje no desaparece, lo que puede ser bastante confuso para el usuario. –

+0

Si va por esta solución, también recomiendo activar la validación al presionar la tecla, lo que hace que el mensaje aparezca y desaparezca a medida que el usuario escribe: http://fczaja.blogspot.co.uk/2009/07/aspnet-how -to-trigger-client-side.html –

0

El siguiente ejemplo en JavaScript/jQuery hará que-

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

      } 
    }     

3

Otra manera de arreglar esto para los navegadores (Firefox, Chrome, Safari) que soportan maxlength en las áreas de texto (HTML5) sin javascript es derivar una subclase de la clase System.Web.UI.WebControls.TextBox y anular el método Render. Luego, en el método reemplazado, agregue el atributo maxlength antes de renderizar de la forma habitual.

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

También podría convertir esto en una ControlAdapter de esta manera no necesitaría reemplazar cada TextBox con el cuadro de texto heredado. – Peter

2

Probé con diferentes enfoques pero todos tenían algunos puntos débiles (i.mi. con cortar y pegar o compatibilidad con el navegador). Esta es la solución que estoy usando en este momento:

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

En este caso, llamo multilineTextBoxKeyUp en la tecla y multilineTextBoxKeyDown hacia abajo clave:

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

uso del atributo personalizado 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> 

esto convertirá como esto

<textarea name="ctl00$BodyContentPlac 
eHolder$txtAddress" rows="4" cols="17" id="txtAddress" maxlength="100"></textarea> 
+0

No funciona en IE 9 o anterior, por lo que tendría que combinarse con un validador como en la respuesta de Alex Angas. – NickG

1

Utilice HTML textarea con runat="server" para acceder a él en el servidor. Esta solución tiene menos problemas que usar javascript o regex.

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

Nota: Para el acceso Text Propiedad en el lado del servidor, se debe utilizar en lugar de txt1.Valuetxt1.Text

16

que sea sencillo. La mayoría de los navegadores modernos admiten un atributo de longitud máxima en un área de texto (incluido IE), así que simplemente agregue ese atributo en código subyacente. Sin JS, sin Jquery, sin herencia, código personalizado, sin problemas, sin muss.

VB.Net:

fld_description.attributes("maxlength") = 255 

C#

fld_description.attributes["maxlength"] = 255 
+1

'fld_description.attributes [" maxlength "] = 255' da un error para' attributes' –

+0

@BarryDoyle Attributes es una propiedad pública de WebControl. es decir, Pascal Case 'fld_description.Attributes [" maxlength "]' – Chronozoa

+1

Esta es la solución correcta, ya que está trabajando en torno a un error (¿limitación?) en el control web, no una limitación del navegador. La única enmienda que podría hacer es que creo que los atributos son cadenas, por lo que "255" no 255. –

1

cosas han cambiado en HTML5:

ASPX:

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

C#:

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

HTML prestados:

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

Los metadatos de Attributes:

Summary: Gets the collection of arbitrary attributes (for rendering only) that do not correspond to properties on the control.

Returns: A System.Web.UI.AttributeCollection of name and value pairs.

+0

Esa es una buena respuesta, pero debes eliminar la condición! IsPostBack porque el TextBox no tendrá la propiedad maxlength si alguien lo elimina en DOM en Firebug, por ejemplo. – krlzlx

+0

Buen punto, aunque en mi aplicación limitada de uso interno esto fue suficiente. – Kristopher

0

Este fragmento trabajó en mi caso. Estaba buscando la solución y pensé en escribir esto para que pueda ayudar a cualquier lector futuro.

ASP

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

Java Script

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 respuesta no trabajó para mí en caso de copiar/pegar. mientras esto lo hace.

0
$("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(); 
        } 
       } 
      } 
     }); 
Cuestiones relacionadas