여러 줄 텍스트 상자에 maxlength 지정


78

asp를 사용하려고합니다.

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

maxlength속성 을 지정하는 방법을 원 하지만 분명히 multiline textbox. 나는 자바 스크립트를 사용하려고 노력했습니다.onkeypress이벤트에 .

onkeypress="return textboxMultilineMaxNumber(this,maxlength)"

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

이 JavaScript 함수의 문제는 잘 작동하지만 문자를 작성한 후에는 문자를 삭제하고 대체 할 수 없으며 해당 동작이 바람직하지 않다는 것입니다.

당신은 그것을 피하기 위해 위의 코드에서 무엇을 변경할 수 있는지 또는 그것을 우회하는 다른 방법을 알고 있습니까?


1
scottyboiler의 모든 답변과 답변을 시도한 것은 확실히 이상적인 솔루션에 가깝습니다. 다른 모든 경우에는 작은 문제가 있습니다 (복사-붙여 넣기, MaxLength 매개 변수가 IE에서 작동하지 않음 등).
nikib3ro 2014

나는 두 번째 @ kape123 여기. 나머지는 모두 결점이 있습니다. 결국 우리는 주어진 한계 이상을 허용하는 필드를 중지하고 한계 내에서 복사 및 붙여 넣기를 할 수 있기를 원합니다!
Fandango68

1
@ Fernando68 나는 대답을 연결하지 않았다는 것을 깨달았습니다-여기 아이디어에 가장 가까운 scottyboiler 솔루션에 대한 링크가 있습니다 -다른 모든 사람들은 몇 가지 실패가 있습니다.
nikib3ro

@ kape123-당신보다 앞서가는 친구! :)
Fandango68

답변:


42

이 자바 스크립트를 시도하십시오.

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

컨트롤에서 다음과 같이 호출하십시오.

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

checkSpecialKeys 함수를 사용하여 자바 스크립트 구현의 입력을 확인할 수도 있습니다.


1
이것은 사용자가 캐리지 리턴을 입력 할 때 제한이 실패한다는 점을 제외하면 훌륭합니다. 캐리지 리턴은 자바 스크립트의 value.length 개수에 아무것도 추가하지 않지만 문자열의 전체 크기에 기여합니다 ( '\ n'는 2 자임). 서버가 문자열 크기를 제한하는 경우 누군가 캐리지 리턴을 사용할 때마다 잘림이 발생합니다.
srmark

내 마지막 댓글은 특정 브라우저에만 적용되는 것 같습니다. IE는 적절한 길이 값 (캐리지 리턴 문자 포함)을 반환합니다. Webkit은 그렇지 않습니다.
srmark

2
이 코드는 서버 측에서 작동하지 않으므로 매우 열악한 솔루션입니다. Alex Angas의 정규식 유효성 검사기는 훨씬 더 나은 솔루션이며 실제로 허용되는 답변이어야합니다.
George

73

용도 정규 표현식 검사기를 대신. 이것은 JavaScript를 사용하는 클라이언트 측에서 작동하지만 JavaScript가 비활성화 된 경우에도 작동합니다 (길이 검사는 서버에서도 수행됨).

다음 예제는 입력 된 값이 0-100 자 사이인지 확인합니다.

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

물론 목적에 더 잘 맞도록 사용할 수있는 더 복잡한 정규식이 있습니다.


2
바보 6 문자 제한 게시물을 편집하면 나 정규식 및 오류 메시지에서 불일치를 해결하기 위해 할 수 ALOW 동안 -가 "최대 입력 해주세요 있어야 100 자"
블라디슬라프

1
이 답변에 대한 유일한 문제는 사용자가 텍스트를 편집하여 제한 범위 내로 가져 오면 메시지가 사라지지 않아 사용자에게 매우 혼란 스러울 수 있다는 것입니다.
Liam Spencer

당신은 내가 또한 메시지가 표시 및 사용자 유형으로 사라지게 키 누름에 대한 검증, 트리거 추천이 솔루션을가는 경우 : fczaja.blogspot.co.uk/2009/07/...
피오나 - myaccessible.website

[\s\S]더 간단한 대신 사용하는 특별한 이유가 .있습니까?
Heinzi

1
방금 발견 한 이유 (어려운 방법) : .does not match newlines, [\s\S]does .
Heinzi

28

간단하게 유지하십시오. 대부분의 최신 브라우저는 텍스트 영역 (IE 포함)에서 maxlength 속성을 지원하므로 해당 속성을 코드 숨김에 추가하기 만하면됩니다. JS, Jquery, 상속, 사용자 정의 코드, 소란스럽지 않습니다.

VB.Net :

fld_description.attributes("maxlength") = 255

씨#

fld_description.Attributes["maxlength"] = 255

1
fld_description.attributes["maxlength"] = 255에 대한 오류를 제공합니다attributes
배리 마이클 도일

@BarryDoyle Attributes는 WebControl의 공용 속성입니다. ie Pascal Casefld_description.Attributes["maxlength"]
Chronozoa

2
브라우저의 제한이 아닌 웹 컨트롤의 버그 (제한?)를 해결하고 있기 때문에 이것이 올바른 솔루션입니다. 내가 할 수있는 유일한 개정 내가 속성이 그래서 "255"하지 255 문자열 생각이다
브라이언 크라 이어

이것이 제가 찾던 것입니다. 감사!
Steve

이것은 "Comments"라는 이름의 여러 줄 텍스트 상자에서 저에게 효과적이었습니다. Comments.Attributes.Add ( "maxlength", "1000"); (Page_Load 이벤트에서).
James Carr

22

나만의 롤 :

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

다음과 같이 전화하십시오.

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

바퀴를 재발 명하는 이유는 무엇입니까? 내장 된 메커니즘을 사용하는 것보다 이것이 어떻게 더 낫습니까? (Alex Angas의 답변)
NickG 2014-06-11

3
@NickG '이 바퀴'가 위의 나무 버전보다 더 잘 회전하기 때문입니다! ;)
Fandango68

이 JavaScript 솔루션을 선호합니다. 위의 내용 RegularExpressionValidator은 문제를 게시하고 web.config를 변경해야 할 수 있습니다. (Re : stackoverflow.com/questions/16660900/… )
user3454439

5

HTML5에서 변경된 사항 :

ASPX :

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

씨#:

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

렌더링 된 HTML :

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

에 대한 메타 데이터 Attributes:

요약 : 컨트롤의 속성에 해당하지 않는 임의의 특성 (렌더링 전용) 컬렉션을 가져옵니다.

반환 System.Web.UI.AttributeCollection값 : 이름 및 값 쌍의 A.


좋은 대답이지만 예를 들어 누군가가 Firebug의 DOM에서 제거하면 TextBox에 maxlength 속성이 없기 때문에! IsPostBack 조건을 제거해야합니다.
krlzlx

내 제한된 내부 사용 응용 프로그램에서는 이것으로 충분했지만 좋은 점입니다.
Kristopher

4

자바 스크립트없이 텍스트 영역 (HTML5)에서 maxlength를 지원하는 브라우저 (Firefox, Chrome, Safari)에서이를 수정하는 또 다른 방법은 System.Web.UI.WebControls.TextBox 클래스의 하위 클래스를 파생하고 Render 메서드를 재정의하는 것입니다. 그런 다음 재정의 된 메서드에서 정상적으로 렌더링하기 전에 maxlength 속성을 추가합니다.

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
이렇게하면 모든 TextBox를 상속 된 텍스트 상자로 바꿀 필요가없는 방식으로 이것을 ControlAdapter로 바꿀 수도 있습니다.
Peter

4

맞춤 속성 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>

이것은 다음과 같이 렌더링됩니다

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

IE 9 또는 이전 버전에서는 작동하지 않으므로 Alex Angas의 답변에서와 같이 유효성 검사기와 결합해야합니다.
NickG 2014-06-11

3
$('#txtInput').attr('maxLength', 100);

작동하지 않으므로 아래 표가 있습니다. 전혀 효과가 없으며 100 자 이상을 입력 할 수 있습니다. 그것은 대답을 쓸모 없게 만듭니다. 따라서 모든 반대표가 있습니다.
NickG 2014-06-11

2
+1 이것은 HTML 4.01에서는 작동하지 않을 수 있지만 'maxlength'속성 이 도입 된 HTML 5에서는 작동 합니다 .
Charles Caldwell

3

HTML 텍스트 영역을 사용 runat="server"하여 서버 측에서 액세스하십시오. 이 솔루션은 javascript 또는 regex를 사용하는 것보다 덜 고통 스럽습니다.

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

참고 : Text서버 측에서 속성에 액세스하려면 txt1.Value대신txt1.Text


2

다른 접근 방식을 시도했지만 모든 접근 방식에는 몇 가지 약점이 있습니다 (예 : 잘라 내기 및 붙여 넣기 또는 브라우저 호환성). 이것이 내가 지금 사용하고있는 솔루션입니다.

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

이 경우에는 키 업시 multilineTextBoxKeyUp을, 키 다운시 multilineTextBoxKeyDown을 호출합니다.

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

1

이것 좀보세요 . 그것을 해결하는 유일한 방법은 시도한대로 자바 스크립트입니다.

편집 : 이벤트를 keypressup으로 변경해보십시오.


1

우리가 한 방법은 다음과 같습니다 (모든 코드를 한 곳에 보관).

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

누군가가 2018 년에도 여전히 웹 양식을 사용하는 경우를 대비하여 ..


0

JavaScript / Jquery의 다음 예제는이를 수행합니다.

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

          }
     }                  


0

이 스 니펫은 제 경우에서 작동했습니다. 나는 해결책을 찾고 있었고 미래의 독자에게 도움이 될 수 있도록 이것을 작성하려고 생각했습니다.

ASP

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

자바 스크립트

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 Answer는 복사 / 붙여 넣기의 경우 나를 위해 일했습니다. 이 동안.


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

0

pageLoad Javascript Event에서 여러 줄 텍스트 상자의 최대 길이를 지정할 수 있습니다.

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

pageLoad () Javascript 함수에서 txtInput 여러 줄 텍스트 상자 의 최대 길이 속성 을 10 자로 설정했습니다.


0

이것은 @KeithK의 답변과 동일하지만 몇 가지 세부 사항이 있습니다. 먼저 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);
        }
    }
}  

위의 코드는 항상 텍스트 모드를 여러 줄로 설정합니다.

이를 사용하려면 aspx 페이지에 등록해야합니다. 이것은 TagPrefix를 사용하여 참조해야하기 때문에 필요합니다. 그렇지 않으면 컴파일이 사용자 지정 제네릭 컨트롤에 대해 불평 할 것입니다.

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

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

0

이제 거의 모든 최신 브라우저에서 textarea 요소에 대한 maxlength 속성 사용을 지원합니다. (https://caniuse.com/#feat=maxlength)

여러 줄 TextBox에 maxlength 속성을 포함하려면 다음과 같이 코드 뒤에있는 Attributes 컬렉션을 간단히 수정할 수 있습니다.

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

이를 지정하기 위해 뒤에있는 코드를 사용할 필요가없는 경우 TextBox에서 파생되는 사용자 지정 컨트롤을 만들 수 있습니다.

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

0

MaxLength 되고 그래서 지금만큼 당신이 .NET 4.7.2 이상으로 프로젝트를 업그레이드로, .NET 4.7.2의로 지원이 자동으로 작동합니다.

여기 의 릴리스 정보에서이를 확인할 수 있습니다 . 특히 다음과 같습니다.

ASP.NET 개발자가 Multiline asp : TextBox에 대해 MaxLength 특성을 지정할 수 있도록합니다. [449020, System.Web.dll, 버그]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.