ViewState 和 Textbox 的只读属性






4.64/5 (11投票s)
本文帮助理解只读属性与视图状态的关系。
引言
一直以来,关于 ASP.NET textbox 的 Readonly
属性被设置为 true
后,服务器端或客户端的更改不会被保留的问题一直存在。这些更改在回发时会被忽略。
Using the Code
让我们理解这两种情况
当 EnableViewState 设置为 True 时
当 EnableViewState
设置为 true
时,只读 textbox 会维护服务器端的变化,但不会维护客户端的变化。
让我们通过一个例子来理解。
声明一个只读 textbox 和两个按钮。由于默认情况下 EnableViewState
属性为 true
,我们没有为 textbox 设置它。
<asp:TextBox ID="TextBox1" runat="server" ReadOnly="true" />
<br />
<asp:Button ID="btnServer" runat="Server"
Text="Server Side" OnClick="btnServer_Click" />
<asp:Button ID="btnClient" runat="Server" Text="Client Side"
OnClientClick="return changevalue();" />
将此 JavaScript 函数放在 head
部分,该函数在客户端修改文本框的值,并在 btnClient
按钮上调用。
<script language="javascript" type="text/javascript">
function changevalue()
{
document.getElementById('TextBox1').value = 'Modified Sample Text';
return false;
}
</script>
现在,在页面加载部分,设置文本框的值。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
TextBox1.Text = "Read only text box";
}
在 btnserver_click
中,只需使用 Response.write()
显示文本框的值。
protected void btnServer_Click(object sender, EventArgs e)
{
Response.Write(TextBox1.Text);
}
现在,只需执行程序。
最初文本框具有“Read only text box”。现在单击客户端按钮,您将看到文本框值已更改为“Modified sample Text”。现在单击服务器端按钮。您将看到分配给文本框的服务器端值显示在屏幕上,而不是客户端值。
当 EnableViewState 设置为 False 时
当 EnableViewState
设置为 false
时,只读 textbox 不会维护服务器端更改和客户端更改。
让我们通过一个例子来理解
声明一个 EnableViewState= "false"
的只读 textbox 和两个按钮
<asp:TextBox ID="TextBox2" runat="server" EnableViewState= "false" ReadOnly="true" />
<br />
<asp:Button ID="btnServer1" runat="Server" Text="Server Side"
OnClick="btnServer1_Click" />
<asp:Button ID="btnClient1" runat="Server" Text="Client Side"
OnClientClick="return changevalue1();" />
将此 JavaScript 函数放在 head
部分,该函数在客户端修改文本框的值
<script language="javascript" type="text/javascript">
function changevalue1()
{
document.getElementById('TextBox2').value = 'Modified Sample Text';
return false;
}
</script>
在页面加载部分,设置文本框的值。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
TextBox2.Text = "Read only text box";
}
在 btnserver_click
中,只需使用 Response.write()
显示文本框的值。
protected void btnServer1_Click(object sender, EventArgs e)
{
Response.Write(TextBox2.Text);
}
现在,只需执行程序。
最初文本框具有“Read only text box”。现在单击客户端按钮,您将看到文本框值已更改为“Modified sample Text”。现在单击服务器端按钮。您将看到屏幕上没有显示任何内容。文本框不仅失去了客户端值,还失去了分配给它的服务器端值。
一个有趣的事情是,如果在设计时使用 EnableViewState= "false"
为只读 textbox 分配任何值,它会保持该值。例如,
<asp:TextBox ID="TextBox3" runat="server"
EnableViewState= "false" ReadOnly="true" Text="Sample Text" />
现在,即使在回发后,Textbox
也会维护在设计时分配的该值。
让我们回到我们的第二种情况
现在,这里的问题是,一旦从服务器丢失值,是否可以通过任何方式检索该值。是的,有...
protected void btnServer1_Click(object sender, EventArgs e)
{
Response.Write(Request.Form[TextBox2.UniqueID]);
}
代码 Request.Form[TextBox2.UniqueID]
将给出文本框的上次修改值(无论是在服务器上还是在客户端上)。
正如我们所看到的,使用只读属性时存在许多问题。避免所有这些问题的最佳解决方案是在代码隐藏文件中。在 Page_Load
中添加以下代码行
TextBox1.Attribute.Add("readonly","readonly");
现在您会注意到,当您运行页面时,您在 TextBox
中所做的客户端更改(通过 JavaScript)会在回发中保留。
查看这些其他参考资料
尽情享用!
历史
- 2009 年 2 月 24 日:首次发布