如何在PostBack()之后保留只读文本框的文本?

29

我有一个 ASP.NET 的 TextBox 控件,并且希望将其设置为只读(用户可以使用另一个控件进行修改)。

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

据我了解,如果将 TextBoxReadOnly 属性设置为 True,它的内容在通过 PostBack() 保存时不会被保存。

是否有一种方法可以在 PostBack() 后保留内容并使该 TextBox 不可编辑?

我尝试将 Enabled 属性设置为 False,但是在执行 PostBack() 后仍然无法保存内容。

7个回答

61

我找到了另一种解决方案,而且更加简单:

将以下内容添加到“页面加载”方法中:

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

3
对于在GridView内遇到此问题的人,您可以在RowDataBound事件期间添加此属性。 - Steve's a D
我在GridView中遇到了这个问题。我在RowDataBound事件中添加了上述代码行。一切都正常工作。文本框在回发时保留其值。我想知道是否可以禁用文本框而不是将其设置为只读,并仍然在回发时保留其值。 - Jackson Lopes

6

让另一个控件将值存储在隐藏字段中,在回传时,从隐藏字段中获取该值并在服务器端将其推入文本框。


2

txtStartDate.Attributes.Add("readonly", "readonly"); 是在页面加载时最好的解决方案之一,可以替代JavaScript、隐藏变量、缓存、cookie、会话和缓存。


1

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


0

我曾经遇到过相同的问题,但是使用了Knockout绑定“enable”和ASP.Net服务器控件文本。

这样做:

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

然而,当表单提交时,该字段的值始终为空。我猜想这是因为如果控件被禁用,则不会在ViewState链上保留。

我通过将绑定“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>

0

这里有一种使用javascript在文本框的onfocus事件中实现它的方法。

使用javascript这样做的优点是,您不需要在代码后台中执行它,如果您需要在网格视图或类似情况下执行它,则可能会很困难。

这个javascript代码仅在Internet Explorer上进行了测试,并且其中的某些部分仅适用于IE,例如createTextRange部分,该部分仅用于使光标停留在文本框中的文本开头,但如果不需要该部分,则可以跳过。

如果此技术的核心在其他浏览器上运行,则应该可以使代码跨浏览器。这里的核心思想是在设置readonly后模糊,然后延迟一段时间再次设置焦点。

如果您只设置readonly,则直到下次给文本框焦点时才变为只读。

当然,代码也可以放入一个函数中,该函数以“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
@Kris,这很容易通过样式来修复,这就是为什么我没有在这里讨论它的原因。 - Magnus

-1
将文本框的ContentEditable属性设置为false ContentEditable="false"。 这样就无法编辑文本框的内容, 即使在postback之后,文本框的值也会保持不变。 我认为这是最简单的方法。

ContentEditable是一个HTML属性,而不是asp.net属性。它对输入框/文本域没有影响。 - Dale K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接