【问题标题】:Viewstate not working certain cases when Control Enable=false TextBox looses value当 Control Enable=false TextBox 失去价值时,Viewstate 在某些情况下不起作用
【发布时间】:2015-10-09 05:05:28
【问题描述】:

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

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

这篇文章听起来像是我的问题,但我得到的结果与他们不同。
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();
    }

【问题讨论】:

  • 在 button1_click 中查看您的代码,您正在使用 tmp.Text.ToString();TextBox1.Text.ToString();。您在哪里使用这些值?这些必须采用语句格式,即将它们分配给变量或控制值。
  • 这只是为了演示目的。在按钮中单击 tmp.Text.ToString() 返回“”,TextBox1.Text.ToString() 返回“Hello, TextBox1”。在我的示例中,我实际上并没有“使用”这些值,它只是通过调试器显示结果。

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


【解决方案1】:

您应该考虑使用ReadOnly = true 而不是Enabled = false

disabled 表单元素的值NOT 传递给处理器方法。更多具体细节请参考disabled-vs-readonly-form-fields/

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

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

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

    李>

更具体的细节可以在这个SO帖子dynamically-created-controls-losing-data-after-postback中的answer given by R.C中找到

在这篇文章ASPNet-Dynamic-Controls-ViewState-Retain-state-for-dynamically-created-controls-on-PostBack中可以找到一种实用的方法

【讨论】:

  • 为什么TextBox1的值可以访问呢?
  • 您链接的文章没有谈论asp.net的启用。我的问题是关于那个,而不是 html 禁用与只读。
  • 是的!谢谢你,先生! :) 我昨晚正在看那个,并认为这是问题所在,但我无法弄清楚。现在按预期工作。再次感谢!
【解决方案2】:

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

只读

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

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

启用:

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

【讨论】:

  • 我认为只读将实现我的目标。但是,我想知道为什么在 enable=false 时返回 TextBox1 的值,但 TextBox2 的值为 ""
  • Read Only 会更加努力,因为在我的实际代码中,我有一个 jQuery datepicker 附加到文本框。因此,用户因此可以“编辑”内容。 Enable = false 只是更容易并实现了我想要的。但是,仅当在页面加载期间未创建/添加文本框时。
猜你喜欢
  • 1970-01-01
  • 2016-08-11
  • 2018-11-28
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
相关资源
最近更新 更多