偶然在一個老外的blog裡看到有這樣的描述,當textbox控制項裡被設定為readonly時,而且頁面的enableviewsate設定為false時,提交後,textbox的值會遺失,這只會發生在asp.net 2.0中,在asp.net 1.0/1.1中不會出現這樣的情況,程式碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" EnableViewState="false" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.Textbox1.Text
= "readonly text";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
protected void Button1_Click(object sender, EventArgs e) { thisted..Textbox1.Text;
}
</script>
<html xmlns=" http://www.w3.org/1999/xhtml " >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form runat="server" id="Form1">
<asp:textbox ID="Textbox1" runat="server" ReadOnly="true" ForeColor="silver"></asp:textbox>
<asp:textbox ID= "Textbox2" runat="server" ReadOnly="true">Some Text</asp:textbox>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /><br />
<asp:Label ID="lblMessage" runat="server" Text="Label"></asp:Label>
</form>
</body>
</html>
在.net 2.0下運行,的確會遺失了文字方塊的值。最後,找到了MSDN的解析和微軟的BUG回饋中心,其實這不是BUG,是.net 2.0下為了安全的一個小改變,具體摘錄如下,大家就明白了:
微軟的回饋為:
After careful analysis, the explanation for the observed behaviour is that:
With a design change in ASP .NET based on user security concern, the input for a readonly textbox is saved in viewstate, which doesnt happen if viewstate is disabled. To workaround this, a page comveloper can add the readaround butb. collection, which can then be used to access the 'value' of the textbox.
We hope this clarifies. Thank you.
Web Server & Tools
MSDN 2005的解析:
The Text value of a TextBox control with the ReadOnly property set to true is sent to the server when a postback occurs, but the server does no processing for a read-only text box. This prevents a malicious user from that value read-only. The value of the Text property is preserved in the view state between postbacks unless modified by server-side code.
來源:jackyrong blog