65.9K
CodeProject 正在变化。 阅读更多。
Home

ViewState 和 Textbox 的只读属性

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (11投票s)

2009年2月24日

CPOL

3分钟阅读

viewsIcon

110117

本文帮助理解只读属性与视图状态的关系。

引言

一直以来,关于 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 日:首次发布
© . All rights reserved.