2011-09-22 59 views
0

这是我的计划为什么文本框在回发时失去其禁用属性,但没有其值属性?

<script src="Scripts/jquery-1.6.4.js" type="text/javascript" language="javascript"></script> 
<script type="text/javascript" language="javascript"> 
    function one() { 
     $(document).ready(function() { 
      $('#<%= textbox.ClientID %>').attr('disabled', 'disabled'); 
     }); 
    } 
    function two() { 
     $(document).ready(function() { 
      $('#<%= textbox.ClientID %>').attr('value', 'hello stackoverflow.com!'); 
     }); 
    } 
</script> 

<input type="button" value="one" onclick="one();" /> 
<input type="button" value="two" onclick="two();" /> 
<asp:TextBox ID="textbox" runat="server"></asp:TextBox> 
<asp:Button ID="postbackButton" runat="server" Text="post back" /> 
  1. 当我点击“按钮,一个”,文本框切换到禁用。然后我点击'回发按钮',文本框切换到启用(它失去了我设置的!)。

  2. 当我点击'按钮2'时,文本框会改变它的值。然后我点击'回发按钮',文本框不会失去它的价值。

我该怎么做才能保持按钮的禁用状态? 如果我可以在客户端做到这一点,它会更好..

非常感谢,卢西亚诺。

回答

0

原因ViewState。页面执行期间ASP.NET服务器控件的每个更改的属性值将由ViewState保存。阅读ViewState

+0

视图状态方案变化是对所控制的服务器的影响。如果在代码隐藏中将ENABLED属性设置为FALSE,则ViewState将发挥作用。在事物的HTML侧或通过脚本在CLIENT上设置的控件值不存储在ViewState中。 –

1

ASP.Net通过ControlState记录您为您发布的值。如果你在后面的代码中设置了DISABLED状态(通过enabled = false),那么它将通过ViewState保留。如果你已经在ASPX页面中设置了它,那只是价值。既然你是通过JS来做的,那么服务器就无法知道它已经被设置了。

处理这种情况的一种方法是,您可以执行诸如在隐藏字段中按名称保留禁用文本框的列表。然后在帖子后面,您可以解析隐藏字段中的值,并在后面的代码中适当地设置文本框的启用状态,从而允许ViewState处理事情。

+0

+1我最初没注意到他是通过JS禁用的,这显然是错误的。 – MStp

0

简单的原因是你必须这样做。

protected void Page_Load(object sender, EventArgs e) 
{ 
    TextBox1.Enabled = true; 
} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    TextBox1.Enabled = false; 
} 

这里您在Load事件中启用了按钮,然后在单击第一个按钮时将其禁用。然后你点击第二个按钮,它将执行回发它将进入Page_Load事件并启用按钮。

如果您只是删除TextBox1.Enabled = true;从Page_Load,PreInit,Init事件中你不会看到这个错误。

不要通过JS启用禁用。

0

如果textboxrunat="server"属性,如果是禁用然后使用javascriptjquery你不能改变它的值。它只能在服务器端更改

相关问题