C# 如何在回发()后保留只读文本框的文本?

C# 如何在回发()后保留只读文本框的文本?,c#,asp.net,textbox,postback,readonly,C#,Asp.net,Textbox,Postback,Readonly,我有一个ASP.NET文本框,我希望它是只读的。(用户使用另一个控件对其进行修改) 但是当存在PostBack()时,文本将重置为空字符串 我理解,如果您将文本框的只读属性设置为True,则其内容不会通过PostBack()保存 是否有办法将内容保留在PostBack()之后,并使文本框不可由用户编辑 我试图将Enabled属性设置为False,但内容在回发()后仍无法保存,请另一个控件将值存储在隐藏字段中,然后在回发时,从隐藏字段中提取值,并将其放入服务器端的文本框中。我找到了另一个更简单的解

我有一个ASP.NET
文本框
,我希望它是
只读的
。(用户使用另一个控件对其进行修改)

但是当存在
PostBack()
时,文本将重置为空字符串

我理解,如果您将
文本框的
只读属性设置为
True
,则其内容不会通过
PostBack()
保存

是否有办法将内容保留在
PostBack()
之后,并使
文本框不可由用户编辑


我试图将
Enabled
属性设置为
False
,但内容在
回发()后仍无法保存,请另一个控件将值存储在隐藏字段中,然后在回发时,从隐藏字段中提取值,并将其放入服务器端的文本框中。

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

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

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

txtStartDate.Attributes.Add(“只读”、“只读”)在页面上加载最佳解决方案中的最佳解决方案,而不是Java脚本、隐藏变量、缓存、cookie、会话和缓存。

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

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

我也遇到过同样的问题,但使用了敲除绑定“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链上持久化

我解决了用attr{readonly:hasZipCode}替换bindig'enable'的问题

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

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

使用javascript这样做的好处是,您不需要在代码隐藏中完成,如果您需要在GridView或类似环境中完成,这可能会很困难

此javascript代码仅在Internet Explorer上测试,其某些部分仅在IE上工作,例如createTextRange部分,该部分仅用于使插入符号位于文本框中文本的开头,但如果不需要,可以跳过该部分

如果此技术的核心在其他浏览器上工作,那么应该可以使代码跨浏览器。这里的核心思想是设置readonly后的模糊,然后超时以再次设置焦点

如果只设置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);
"
  />


ContentEditable是HTML属性而不是asp.net属性。它对输入/文本区域没有影响。对于在gridview中存在此问题的任何人,您可以在RowDataBound事件期间添加此属性。我在gridview中存在此问题。我在RowDataBound事件中添加了上述行。一切正常。文本框在回发时保留其值。我想知道我是否可以禁用文本框,而不是将其设置为只读,并且在回发时仍保留其值。很抱歉,这种方法会有一个缺点-在进入文本框之前,您不知道它是否可编辑,这不是一种好的用户体验@克里斯,这很容易用风格来解决,这就是为什么我没有在这里讨论它。