为什么文本框在回发时会丢失其已禁用的属性,而不是其值属性?

时间:2011-09-22 04:50:22

标签: jquery asp.net

这是我的程序

<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. 当我点击“按钮1”时,文本框会切换为禁用。然后我点击“回发按钮”,文本框切换为启用(它丢失了我设置的内容!)。

  2. 当我点击“按钮2”时,文本框会更改其值。然后我点击“回发按钮”,文本框不会丢失其值。

  3. 如何保持按钮的禁用状态? 如果我能在客户端做到这一点,那就更好了。

    非常感谢Luciano。

4 个答案:

答案 0 :(得分:1)

ASP.Net通过ControlState跟踪您发布的值。如果您在后面的代码中设置了DISABLED状态(通过enabled = false),那么它将通过ViewState保留。如果您在ASPX页面中设置了它,它就是值。由于您是通过JS进行的,因此服务器无法知道它已被设置。

处理此问题的一种方法是,您可以执行以下操作:在隐藏字段中按名称保留已禁用文本框的列表。然后在帖子后面,你可以解析隐藏字段中的值,并在后面的代码中适当地设置文本框的启用状态,允许ViewState处理事情。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

在此处启用Load事件中的Enabled按钮,然后在单击第一个按钮时将其禁用。然后你点击第二个按钮,它将进行回发,它将进入Page_Load事件并启用按钮。

如果您只是删除TextBox1.Enabled = true;从Page_Load,PreInit,Init事件您将看不到此错误。

不要通过JS启用禁用。

答案 3 :(得分:0)

如果textbox具有runat="server"属性且是否已禁用,则您无法使用javascriptjquery更改其值。它只能在服务器端更改