原來
readonly有這麼神奇卻又除不出錯的功效。
TextBox
如果把 ReadOnly 屬性設定為 True,透過 JavaScript 設定的值,在 ASP.NET 2.0
是無法取到值的!
解決之道:
測試用的Javascript語法
<script language="javascript" type="text/javascript">
function ChangeText(){
form1["TextBox1"].setAttribute("innerText", "abc");
}
</script>
<input id="Button" type="button" onclick="ChangeText()" value="用Javascript改值" />
在頁面上做一個TextBox,id=TextBox1,text="12345"
如果在它的標籤裡加上readonly="True" ,或在Page_load事件中設TextBox1.readonly=True
那這樣就會變成server端的控制事件,它會在viewstate中紀錄這個TextBox為readonly,任何client端對它所做的改變,server是不承認的。
可是若用Page_Load中用Attributes的方式,這樣就可以繞過server控制,在client端才加上readonly屬性。雖然render出來的原始碼都一樣,但viewstate中的欄位屬性就不會加上readonly屬性,卻又達成在client端可用javascript去改值的運算。
抓了1小時的Bug,才熊熊想起這個東西,真是不好意思吶~~ (求饒)
PS.所以用上面那個解方,就不需要用TextBox1.Enable=False,也不用去改顏色囉!
--
把Page中的Textbox做統一處理的方法,看了很多網路的做法,大家都沒加Form,可是我卻得加Form才能work。
For Each obj As Control In Me.Page.Form.Controls
If TypeOf (obj) Is TextBox Then
CType(obj, TextBox).Text = CType(obj, TextBox).Id.tostring()
CType(obj, TextBox).Attributes("readonly") = "readonly"
End If
Next
如果直接用Page.Controls去做,在它下面有4個Literal跟一個Form物件。
那個Form物件才是ASP.net的控制項大本營啊~~
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %>
<html>
<head runat="server">
<title>未命名頁面</title>
</head>
<body>
<form id="form1" runat="server">
<div>
This is Big Hiv......
</div>
</form>
</body>
</html>
留言列表