[asp.net] تحديد الطول الأقصى لمربع النص متعدد الأسطر



Answers

استخدم مدقق تعبير عادي بدلاً من ذلك. سيعمل ذلك على جانب العميل باستخدام جافا سكريبت ، ولكن أيضًا عند تعطيل جافا سكريبت (كما سيتم إجراء فحص الطول على الخادم أيضًا).

يتحقق المثال التالي من أن القيمة المدخلة تتراوح بين 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>

هناك بالطبع تعابير regexs أكثر تعقيدًا يمكنك استخدامها لتلائم أغراضك بشكل أفضل.

Question

أحاول استخدام asp:

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

أريد طريقة لتحديد الخاصية maxlength ، ولكن يبدو أنه لا توجد طريقة ممكنة 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 هذه هي أنه بعد كتابة الأحرف لا يسمح لك بحذف أي منها أو استبداله ، فهذا السلوك غير مرغوب فيه.

هل لديك أي فكرة عما يمكن أن أغيره في الشفرة المذكورة أعلاه لتجنب ذلك أو أي طرق أخرى للتغلب عليه؟




أبقيها بسيطة. تدعم معظم المتصفحات الحديثة سمة maxlength في منطقة نصية (بما في ذلك IE) ، لذلك ببساطة أضف تلك السمة في التعليمات البرمجية الخلفية. لا JS ، لا مسج ، لا الميراث ، رمز مخصص ، لا ضجة ، لا مهوس.

VB.Net:

fld_description.attributes("maxlength") = 255

C #

fld_description.attributes["maxlength"] = 255



المثال التالي في 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); 

          }
     }                  




لقد جربت أساليب مختلفة ولكن كل واحد لديه بعض نقاط الضعف (أي مع قص ولصق أو توافق المستعرض). هذا هو الحل الذي أستخدمه الآن:

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



استخدم textarea HTML مع runat="server" للوصول إليه في جانب الخادم. هذا الحل لديه ألم أقل من استخدام javascript أو regex.

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

ملاحظة: للوصول إلى خاصية Text في جانب الملقم ، يجب استخدام txt1.Value بدلاً من txt1.Text




هناك طريقة أخرى لإصلاح هذا للمتصفحات (Firefox ، Chrome ، Safari) التي تدعم maxlength على textareas (HTML5) بدون javascript وهي اشتقاق فئة فرعية من فئة System.WI.WI.WebControls.TextBox وتجاوز طريقة Render. ثم في الأسلوب overridden أضف سمة 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);
}



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



Related