【问题标题】:How to set maxlength for multiline TextBox?如何为多行文本框设置最大长度?
【发布时间】:2012-04-05 13:33:30
【问题描述】:

使用 MultiLine TextBox(生成 TextArea)时,设置 MaxLength 属性无效。最好的解决方法是什么?我想用最少的丑陋的 javascript 等获得基本的、预期的功能。只是防止用户输入超过最大数量的字符。

【问题讨论】:

标签: asp.net textbox


【解决方案1】:

要强制 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. 在页面或母版页中

确保在步骤 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()));
            }

【讨论】:

    【解决方案2】:

    试试这个..

        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)
    

    【讨论】:

      【解决方案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();
              }
          });
      
      }); 
      

      【讨论】:

        【解决方案4】:

        如果您不关心旧版浏览器(请参阅supported browsers here),
        你可以像这样正常设置 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】:

          如果您使用绑定到该文本框的模型对象,您可以使用 DataAnnotations 属性来设置该属性的最大长度。我基于 MVC,但它也应该适用于 ASP.NET!

          这样您就不会弄乱任何 Javascript 或在标记中设置任何内容。

          【讨论】:

          • 不幸的是,WebForms 没有像 MVC 这样的数据注释的原生支持。但是有一些解决方法,我检查一下,谢谢!所需答案的完美示例)+1
          【解决方案6】:

          嘿 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

          【讨论】:

          • 虽然这会阻止用户输入更多文本,但也会阻止他们使用框中的删除键或退格键(或任何其他键),因此一旦到达限制。
          • 您的答案比接受的答案更完整、更有用。为你 +1
          【解决方案7】:

          如果您想让用户知道他是否超出了他所写的字符数,您可以使用附加到按键事件的 javascript 函数。此函数将测试输入的长度,如果达到最大长度,则取消字符渲染。

          另一种选择是使用RegularExpressionValidator 控件来验证提交时的输入。

          在我看来,第一种选择要好得多。

          我没有添加任何代码,因为谷歌充满了各种口味的示例,这是一项非常常见的任务。

          Here您有一个可能有帮助的示例搜索。

          【讨论】:

            猜你喜欢
            • 2010-10-22
            • 2010-11-22
            • 2017-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-19
            • 1970-01-01
            • 2018-08-31
            相关资源
            最近更新 更多