【问题标题】:How to keep the Text of a Read only TextBox after PostBack()?PostBack()之后如何保留只读文本框的文本?
【发布时间】:2023-03-05 09:14:01
【问题描述】:

我有一个 ASP.NET TextBox,我希望它是 ReadOnly。 (用户使用另一个控件对其进行修改)

但是当有PostBack() 时,文本会被重置为空字符串。

我了解,如果您将TextBoxReadOnly 属性设置为True,则其内容不会通过PostBack() 保存。

有没有办法保留PostBack() 之后的内容并使TextBox 不能被用户编辑?

我尝试将Enabled属性设置为False,但是PostBack()之后内容仍然没有保存。

【问题讨论】:

    标签: c# asp.net textbox postback readonly


    【解决方案1】:

    我找到的另一个更简单的解决方案:

    将此添加到页面加载方法中:

    protected void Page_Load(object sender, EventArgs e)
    {
         TextBox1.Attributes.Add("readonly", "readonly");
    }
    

    【讨论】:

    • 对于任何在网格视图中遇到此问题的人,您可以在 RowDataBound 事件期间添加此属性
    • 我在 gridview 中遇到了这个问题。我在 RowDataBound 事件中添加了上述行。一切正常。文本框在回发时保留其值。我想知道是否可以禁用文本框而不是将其设为只读并在回发时仍保留其值。
    【解决方案2】:

    这是一种在文本框本身的 onfocus 事件中使用 javascript 的方法。

    使用 javascript 这样做的好处是您不需要在后面的代码中执行此操作,如果您需要在 gridviews 或类似中执行此操作可能会很困难。

    此 javascript 代码仅在 Internet Explorer 上测试,它的某些部分只能在 IE 上运行,例如 createTextRange 部分,它只是为了使插入符号出现在文本框中文本的开头,但是如果不需要,可以跳过该部分。

    如果这项技术的核心适用于其他浏览器,那么应​​该可以使代码跨浏览器。这里的核心思想是设置只读后的模糊,然后超时重新设置焦点。

    如果你只设置只读,那么它不会变成只读,直到你下次给文本框焦点。

    当然,也可以将代码放入函数中,以“this”作为参数调用。

      <asp:TextBox 
        ID="txtSomething" 
        runat="server"
        Text='<%# Bind("someData") %>'
        onfocus="
    var rng = this.createTextRange();
    rng.collapse();
    rng.select();
    if (this.allowFocusevent=='0') {return;};
    this.allowFocusevent='0';
    this.readOnly=true;
    this.blur();
    var that=this;
    setTimeout(function(){that.focus()},0);
    "
      />
    

    【讨论】:

    • 很抱歉,这种方法会有一个缺点——直到你进入文本框你才知道它是否可编辑,这不是一个好的用户体验!
    • @Kris,这很容易用样式来解决,这就是为什么我没有在这里讨论它。
    【解决方案3】:

    我也遇到过同样的问题,但使用了 Knockout 绑定“启用”和 ASP.Net 服务器控制文本。

    这边:

    <asp:TextBox ID="txtCity" runat="server" required="required" class="form-control" placeholder="City" data-bind="value: city, enable: !hasZipCode()"></asp:TextBox>
    

    但是,提交表单时,此字段值始终为空。发生这种情况,我想是因为如果控件被禁用,它就不会保留在 ViewState 链上。

    我解决了将 bindig 'enable' 替换为 'attr{ readonly: hasZipCode}'

        <asp:TextBox ID="txtCity" runat="server" required="required" class="form-control" placeholder="City" data-bind="attr{ value: city, readonly: hasZipCode }">/asp:TextBox>
    

    【讨论】:

      【解决方案4】:

      使用Request.Form[txtDate.UniqueID] 获取值。你会得到它!

      【讨论】:

        【解决方案5】:

        将文本框的 ContentEditable 属性设置为 false ContentEditable="false".. 它不允许您编辑文本框的内容 ie;将使文本框只读并且 也将使回发后的值留在文本框中.. 我认为这是最简单的方法..

        【讨论】:

        • ContentEditable 是 HTML 属性而不是 asp.net 属性。它对输入/文本区域没有影响。
        【解决方案6】:

        txtStartDate.Attributes.Add("readonly", "readonly"); 在最好的解决方案中的页面加载上,而不是 Javascript、隐藏变量、缓存、cookie、会话和缓存。

        【讨论】:

          【解决方案7】:

          让您的其他控件将值存储在隐藏字段中,并在回发时,从隐藏字段中提取值并将其推送到服务器端的文本框中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多