原來

readonly有這麼神奇卻又除不出錯的功效。

TextBox 如果把 ReadOnly 屬性設定為 True,透過 JavaScript 設定的值,在 ASP.NET 2.0 是無法取到值的!
 

解決之道:

  1. 利用 Request 來取值。
  2. 如果非要使用 textBox.Text 來取值的話,textBox. ReadOnly 記的還是設為 false 
  3. 但是在 Page_Load,加入
  • textBox1.Attributes.Add("ReadOnly", "ReadOnly") 
  • textBox1.Attributes("ReadOnly")= "ReadOnly" 
  • textBox1.Attributes("ReadOnly")= "True"

 測試用的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>

 

 

 

 

 

 

arrow
arrow
    全站熱搜

    ikaritw 發表在 痞客邦 留言(2) 人氣()