当Control Enable = false时,Viewstate无法处理某些情况TextBox会丢失值

时间:2015-10-09 05:05:28

标签: c# asp.net .net-4.5 asp.net-4.5

我在一些代码中发现了一个问题,但无法弄清楚原因。我正在使用 .Net 4.5。有谁能告诉我这两种情况之间的区别?我尝试了一些不同的东西,如javascript来禁用通过Page.ClientScript或身体onload事件,但我没有得到我想要的东西(TextBox2是“”,TextBox1是“Hello,TextBox1”)。当我评论tmp.Enable = false时,一切都很好。我希望能够禁用这两个控件但仍然可以访问Text值。适用于“TextBox1”但不适用于“tmp”又称“TextBox2”。

在Page_Load期间创建!IsPostBack和TextBox2的原因是因为我正在动态创建X个控件并从datareader设置它们的值。然后,用户可以修改它们并将其保存到表中。一定有办法!

这篇文章听起来像我的问题,但我得到的结果与他们不同 ASP.Net ViewState doesn't work when Control become Enable=False

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
    function t() {
        document.getElementById("TextBox1").disabled = true;
        document.getElementById("TextBox2").disabled = true;
    }
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
    <asp:Panel runat="server" ID="Panel1">
        <asp:TextBox runat="server" ID="TextBox1"></asp:TextBox>
    <asp:Button runat="server" ID="button1" OnClick="button1_Click" />
    </asp:Panel>
</div>
</form>
</body>
</html>

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) { TextBox1.Text = "Hello, TextBox1"; }
        TextBox1.Enabled = false; 
        TextBox tmp = new TextBox();
        tmp.ID = "TextBox2";
        if (!IsPostBack) { tmp.Text = "Hello, TextBox2"; }
        tmp.Enabled = false;
        Panel1.Controls.Add(tmp); 
    }

    protected void button1_Click(object sender, EventArgs e)
    {
        TextBox tmp = ((TextBox)Page.FindControl("TextBox2"));
        if(tmp != null)
        {
            tmp.Text.ToString();
        }
        TextBox1.Text.ToString(); 
    }

}

更新 根据haraman的建议,我可以通过进行以下更改来实现它:

protected void Page_PreInit(object sender, EventArgs e)
    {
        TextBox tmp = new TextBox();
        tmp.ID = "TextBox2";
        Panel1.Controls.Add(tmp); 
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) { TextBox1.Text = "Hello, TextBox1"; }
        TextBox1.Enabled = false;

        if (!IsPostBack) { ((TextBox)Page.FindControl("TextBox2")).Text = "Hello, TextBox2"; }
        ((TextBox)Page.FindControl("TextBox2")).Enabled = false;


    }
    protected void button1_Click(object sender, EventArgs e)
    {
        TextBox tmp = ((TextBox)Page.FindControl("TextBox2"));
        if (tmp != null)
        {
            tmp.Text.ToString();
        }
        TextBox1.Text.ToString();
    }

2 个答案:

答案 0 :(得分:2)

您应该考虑使用ReadOnly = true代替Enabled = false

已禁用表单元素的值 NOT 传递给处理器方法。有关更具体的详细信息,请参阅disabled-vs-readonly-form-fields/

编辑: 关于您的代码的添加
用你的代码创建了一个测试用例,发现我只是误读了你的代码。以下是您的代码中发生的事情:

  1. 您在每个PostBack上创建一个新的TextBox(tmp) 重新创建 tmp (但TextBox1已存在且未重新创建)

  2. 您不会在每个PostBack上为tmp赋值 这意味着tmp中没有文字(TextBox1没有被重新创建,保留其文本)

  3. 更多具体细节可在此SO帖子answer given by R.C

    dynamically-created-controls-losing-data-after-postback中找到

    在这篇文章ASPNet-Dynamic-Controls-ViewState-Retain-state-for-dynamically-created-controls-on-PostBack

    中可以找到相同的实用方法

答案 1 :(得分:0)

尝试使用Read Only属性????

只读

  

在TextBox的上下文中,readonly允许用户将焦点设置为   并选择并复制文本但不修改它。禁用的TextBox   不允许任何互动。

     

当您拥有希望用户查看的数据时,请使用ReadOnly   复制,但不能修改。当您拥有数据时,请使用已禁用的文本框   显示不适用于对话框的当前状态或   窗口。

启用:

  

获取或设置一个值,指示控件是否可以响应   用户互动。