如何为多行文本框设置最大长度?

11

使用多行文本框(生成TextArea)时,设置MaxLength属性没有效果。最好的解决方法是什么?我想要基本的、预期的功能,最小化使用不美观JavaScript。只需防止用户输入超过最大字符数即可。


可能是指定多行文本框的最大长度的重复问题。 - Ali Gonabadi
7个回答

26
如果您不关心旧版浏览器(请参见此处支持的浏览器),
您可以像这样正常设置MaxLength。
<asp:TextBox ID="txt1" runat="server" TextMode="MultiLine" MaxLength="100" />

并将其强制打印到HTML中

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
    txt1.Attributes.Add("maxlength", txt1.MaxLength.ToString());
}

5
嗨,pukipuki,你可以按照以下步骤操作:
<asp:TextBox ID="txtValue" runat="server"TextMode="MultiLine" Rows="10"Columns="50"></asp:TextBox>

 $(document).ready(function(){ 
 var MaxLength = 250; 
 $('#txtValue').keypress(function(e) 
 { 
     if ($(this).val().length >= MaxLength)
 {    
    e.preventDefault();
 }  
 });});

你可以在以下链接中了解更多信息: http://jquerybyexample.blogspot.in/2010/10/set-max-length-for-aspnet-multiline.html

6
虽然这个限制可以防止用户输入过多的文本,但同时它也会禁用删除键、退格键(或其他任何键)使得用户到达字数限制后无法编辑该文本。 - David Conlisk
你的回答比被采纳的更完整和有用。给你点赞 +1。 - Michel Ayres

5
如果你想让用户在输入时知道是否超过了字符限制,可以使用附加到keypress事件的javascript函数。该函数会测试输入的长度,并在达到最大长度时取消字符渲染。
另一个选项是在提交时使用RegularExpressionValidator控件来验证输入。
在我看来,第一种选项更好。
我不会添加任何代码,因为谷歌上有各种各样的例子,这是一个非常常见的任务。

这里有一个可能会有所帮助的搜索示例。


3

以下是一个跨浏览器的解决方案:

<asp:TextBox TextMode="MultiLine" runat="server" ID="txtPurpose" Columns="50" Rows="2" onkeypress="return isokmaxlength(event,this,255);" ClientIDMode="static"></asp:TextBox>

Javascript :

function isokmaxlength(e,val,maxlengt) {
    var charCode = (typeof e.which == "number") ? e.which : e.keyCode

    if (!(charCode == 44 || charCode == 46 || charCode == 0 || charCode == 8 || (val.value.length < maxlengt))) {
        return false;
    }
}

您需要考虑复制和粘贴。这有点棘手,我使用Jquery简单地禁用它。但是您可以创建自己的函数来进行更复杂的验证。但在我的情况下,不允许复制和粘贴。

Jquery禁用复制和粘贴:

jQuery(function ($) {

    $("#txtPurpose").bind({
        paste: function (e) {
            e.preventDefault();
        }
    });

}); 

1
如果您正在使用绑定到该文本框的模型对象,您可以使用DataAnnotations属性来设置该属性的最大长度。我是基于MVC的,但这也适用于ASP.NET!
这样,您就不会干扰任何Javascript或在标记中设置任何内容。

1
不幸的是,WebForms没有像MVC那样原生支持数据注释。但是有一些解决方法,我会去尝试一下,谢谢!(期望回答的完美例子)+1 - Timur Sadykov

0

为了强制 asp.net 在页面或整个站点上为所有多行文本框发送 maxlength 属性,请根据 Aximili 上面的答案构建:

  1. 创建一个函数来获取页面上的所有控件:

我使用 David Findley 的控件扩展方法 https://weblogs.asp.net/dfindley/linq-the-uber-findcontrol 并在此 SO 帖子中引用 Loop through all controls on asp.net webpage

namespace xyz.Extensions
{
    public static class PageExtensions
    {
        public static IEnumerable<Control> All(this ControlCollection controls)
        {
            foreach (Control control in controls)
            {
                foreach (Control grandChild in control.Controls.All())
                    yield return grandChild;

                yield return control;
            }
        }
    }
}
  1. 在页面或母版页中

确保在第一步中引用了扩展方法的命名空间。

将以下代码放入Page_Load函数中:

if (!IsPostBack){
    //force textareas to display maxlength attribute 
    Page.Controls.All().OfType<TextBox>().ToList()
                    .Where(x => x.TextMode == TextBoxMode.MultiLine && x.MaxLength > 0)
                    .ToList().ForEach(t => t.Attributes.Add("maxlength", t.MaxLength.ToString()));
            }

0

试试这个...

    Dim script As String = ""

    script = script + " <script type='text/javascript'> function CheckLength(obj) {"
    script = script + "  var object = document.getElementById(obj);"
    script = script + " if (object.value.length > 5) {"
    script = script + "     object.focus();"
    script = script + "      object.value = object.value.substring(0, 5); "
    script = script + "      object.scrollTop = object.scrollHeight; "
    script = script + "      return false;"
    script = script + "   }"
    script = script + "   return true;"
    script = script + "   }</script>"


    Dim b As New TextBox()
    b.ID = "btnSomeButton"
    b.TextMode = TextBoxMode.MultiLine
    Mypanel.Controls.Add(b)
    b.Attributes.Add("onkeyup", "return CheckLength('" & b.ClientID & "');")

    Page.ClientScript.RegisterStartupScript(Page.GetType(), "key", script, False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接