C# 控件启用=假文本框释放值时,Viewstate不工作的某些情况

C# 控件启用=假文本框释放值时,Viewstate不工作的某些情况,c#,asp.net,.net-4.5,asp.net-4.5,C#,Asp.net,.net 4.5,Asp.net 4.5,我在我的一些代码中发现了一个问题,无法找出原因。我正在使用.NET4.5。有人能告诉我这两种情况的区别吗?我尝试了一些不同的东西,比如通过Page.ClientScript或在body onload事件上禁用javascript,但我没有得到我想要的(TextBox2是“”,TextBox1是“你好,TextBox1”)。当我注释掉tmp.Enable=false时,一切正常。我希望能够禁用这两个控件,但仍然可以访问文本值。适用于“TextBox1”,但不适用于“tmp”即“TextBox2”

我在我的一些代码中发现了一个问题,无法找出原因。我正在使用.NET4.5。有人能告诉我这两种情况的区别吗?我尝试了一些不同的东西,比如通过
Page.ClientScript
或在body onload事件上禁用javascript,但我没有得到我想要的(TextBox2是“”,TextBox1是“你好,TextBox1”)。当我注释掉
tmp.Enable=false
时,一切正常。我希望能够禁用这两个控件,但仍然可以访问文本值。适用于“TextBox1”,但不适用于“tmp”即“TextBox2”

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

这篇文章听起来像是我的问题,但我得到的结果与他们不同。

尝试使用属性

只读

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

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

启用:

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


您应该考虑使用<代码> RealOnt= Trime< /Cord>,而不是<代码>启用= false 。 禁用的表单元素的值不会传递给处理器方法。有关详细信息,请参阅

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

  • 每次回发时都会创建一个新的文本框(tmp)。
    tmp已重新创建(但TextBox1已存在且未重新创建)

  • 您不会在每次回发时为tmp赋值
    这意味着tmp中没有文本(未重新创建TextBox1,保留其文本)

  • 更具体的细节可以在这篇文章中找到


    在这篇文章中可以找到一种实用的方法

    在button1\u单击查看您的代码,您正在使用
    tmp.Text.ToString()
    TextBox1.Text.ToString()。您在哪里使用这些值?它们必须采用语句格式,即将它们分配给变量或控制值。这只是为了演示。在按钮中,单击tmp.Text.ToString()返回“”,TextBox1.Text.ToString()返回“您好,TextBox1”。在我的示例中,我并没有实际“使用”这些值,只是通过调试器显示结果。那么为什么可以访问TextBox1的值呢?您链接的文章没有提到asp.net的Enable。我的问题是关于这一点,而不是html禁用vs只读。是的!!谢谢你,先生!:)昨晚我看到了这个问题,认为这就是问题所在,但我想不出来。现在一切正常。再次感谢!我认为只读将实现我的目标。。然而,我想知道为什么当enable=false时返回TextBox1的值,而TextBox2的值为“”只读时要花费更多的精力,因为在我的实际代码中,我在textbox上附加了一个jQuery日期选择器。因此,用户可以“编辑”内容。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(); 
        }
    
    }
    
    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();
        }