在TextBox元件中設定的MaxLength,測試結果是對字數的限制,但是對應到資料庫的欄位長度就不符合,若輸入中文(double bytes)可能常常造成Oracle吐錯誤訊息「ORA-01401: Inserted value too large for column」,提供參考方向: 自訂控制項。
1. 繼承原有的TextBox,並修改MaxLength的實作AddAttributesToRender:
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System;
namespace CONTROL
{
[ToolboxData("<{0}:TxtCommon runat=\"server\"></{0}:TxtCommon>")]//指定當自訂控制項從工具箱拖曳出來時,為此自訂控制項產生的預設標記。
public class TxtCommon : TextBox
{
protected override void OnInit(System.EventArgs e)
{
base.OnInit(e);
// 開始註冊JS在頁面上, 如果已經註冊便跳過
Type type = this.GetType();
string strJsLoc = "";
string key = "CONTROL.JavaScript.Utility.js";
if (!Page.ClientScript.IsClientScriptIncludeRegistered(key))
{
strJsLoc = this.Page.ClientScript.GetWebResourceUrl(type, key);
this.Page.ClientScript.RegisterClientScriptInclude(key, strJsLoc);
}
}
/// <summary>
/// 寫入控制項額外屬性
/// </summary>
/// <param name="writer"></param>
protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
string strOnBlur = "";
if (this.MaxLength != 0)
{
strOnBlur += string.Format("ChkBLen(this,{0});", this.MaxLength.ToString());
}
if (strOnBlur != "")
{
writer.AddAttribute("onblur", strOnBlur);
}
}
}
}
2. 在註冊的JS中實作ChkBLen:
//檢核長度
function ChkBLen(obj,intMaxByte)
{
obj.value=obj.value;
if(obj.value.Blength()>intMaxByte)
{
alert("超過最大長度限制:"+intMaxByte);
while(obj.value.Blength()>intMaxByte)
{
obj.value=obj.value.substr(0,obj.value.length-1)
}
obj.focus();
}
}
//傳回字串的byte長度
String.prototype.Blength = function() {
var arr = this.match(/[^\x00-\xff]/ig);
return arr == null ? this.length : this.length + arr.length;
}
如此一來,在新增 TxtCommon自訂控制項時,若設定MaxLength,則在onblur事件發生時,就會自動呼叫ChkBLen,自動截斷多於的長度。
沒有留言:
張貼留言