2011年12月17日

[Asp.net] - TextBox.MaxLength在 MultiLine下無效果

最近在做TextBox限制長度大小時, 很開心的使用多行的功能時,又寫了限制字數的大小

詭異的事情發生了!!怎麼還是可以打超過字元...我明明寫了MaxLength="10"

不死心的在瀏覽模式下檢視原始碼...

竟然發現TextBox轉譯成TextArea格式,而且MaxLength這個屬性不見了!!


又比對了沒有下TextMode="MultiLine"屬性的結果,

TextBox轉成了input,而且 MaxLength有出現!!!


後來上網查了資料才知道已經有許多先進遇到這種詭譎的問題了!

後來推測是因為.net在轉換Html時,如果是多行模式會轉成TextArea這個標籤

而TextArea本身沒有提供MaxLength屬性,

解決的方法有二:
1.一位保哥的Blog,提供修改過的TextBox物件,可以在MultiLine模式下提供字元限字的方法

2.使用JavaScript來做Client的控管,個人比較偏好這個,簡單明瞭。

function ismaxlength(obj){
  var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : "";
  if (obj.getAttribute && obj.value.length>mlength)
    obj.value=obj.value.substring(0,mlength);
}

後端程式要加上下面兩行
  TextBox1.Attributes.Add("maxlength", "200");
//給TextArea maxlength屬性,目前測試是沒辦法直接在TextBox上加
//.net不會把maxlength屬性加上到TextArea標籤上
  TextBox1.Attributes.Add("onkeyup", "return ismaxlength(this)");


這樣就大功告成囉~!

2 則留言:

  1. Hi~今天專案正好在找相關的資料發現到你這裡
    2.的方法的確很簡單明瞭,可是我測試到如果user很機車用滑鼠做複製貼上的動作的話,js似乎是不會檢查到
    1.的方法保哥提到的Annsa,該網站已有提供sample code下載,是.net 2.0編譯的,我是在.net 4.0的專案直接參考加入他的AnnsaControls.dll,只要在.apsx註冊一下<%@ Register Assembly="AnnsaControls" Namespace="Annsa.Controls" TagPrefix="annsaControls" %>
    內容就可以直接使用
    Improved Multiline Text Box (MaxLength set to 20)


    效果蠻不錯的~
    總之 謝謝您提供的資訊

    回覆刪除
    回覆
    1. sorry 好像有些字秀不出來 詳情看他sample code的SampleWeb的Default.aspx也一樣

      刪除