指定多行文本框的最大长度

我试图使用asp:

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

我想要一种方法来指定maxlength属性,但显然multiline textbox不可能的。 我一直在尝试使用一些JavaScript的onkeypress事件:

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

在使用这个JavaScript函数的时候,工作正常的问题是,在写入字符之后,它不允许你删除和replace它们中的任何一个,这种行为是不希望的。

你有什么想法可以改变在上面的代码,以避免这种或任何其他方式绕过它?

试试这个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; } 

在控制上调用它像这样:

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

你也可以使用checkSpecialKeys函数来validation你的JavaScript实现上的input。

请使用正则expression式validation器 。 这将在使用JavaScript的客户端工作,而且当JavaScript被禁用时(因为长度检查也将在服务器上执行)。

以下示例检查input的值是否在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> 

当然还有更复杂的正则expression式可以用来更好地适应你的目的。

滚动你自己的:

 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> 

把事情简单化。 大多数现代浏览器支持文本区域(包括IE)的maxlength属性,因此只需在代码隐藏中添加该属性即可。 没有JS,没有JQuery,没有inheritance,自定义代码,没有大惊小怪,没有麻烦。

VB.Net:

 fld_description.attributes("maxlength") = 255 

C#

 fld_description.attributes["maxlength"] = 255 

使用自定义属性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> 
 $('#txtInput').attr('maxLength', 100); 

另一种解决这个问题的方法是,在没有javascript的textareas(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); } 

我尝试了不同的方法,但每个人都有一些薄弱点(即与剪切和粘贴或浏览器兼容性)。 这是我现在使用的解决scheme:

 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 + "');"); 

看看这个 。 解决这个问题的唯一方法就是通过javascript来尝试。

编辑:尝试将事件更改为按键。

使用HTML textarea和runat="server"来在服务器端访问它。 这种解决scheme比使用JavaScript或正则expression式痛苦less。

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

注意:要访问服务器端的Text属性,应该使用txt1.Value而不是txt1.Text

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:

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

Attributes的元数据:

摘要:获取与控件属性不相对应的任意属性(仅用于呈现)的集合。

返回:名称和值对的System.Web.UI.AttributeCollection

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

这段代码在我的情况下工作。 我正在寻找解决scheme,并认为写这个,以便它可以帮助任何未来的读者。

ASP

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

Java脚本

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

@劳尔·罗阿答复确实为我工作的情况下复制/粘贴。 虽然这样做。

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