Ответ 1
Еще одно решение, которое я нашел и более простой:
Добавьте это к методу загрузки страницы
protected void Page_Load(object sender, EventArgs e)
{
TextBox1.Attributes.Add("readonly", "readonly");
}
У меня есть ASP.NET TextBox
, и я хочу, чтобы он был ReadOnly
. (Пользователь может изменить его с помощью другого элемента управления)
Но когда есть PostBack()
, текст получает reset в пустую строку.
Я понимаю, что если вы установите для свойства ReadOnly
значение True
для TextBox
, содержимое не будет сохранено через PostBack()
.
Есть ли способ сохранить содержимое после PostBack()
и сделать TextBox
недоступным для редактирования пользователем?
Я попытался установить свойство Enabled
на False
, но все же содержимое не сохраняется после PostBack()
.
Еще одно решение, которое я нашел и более простой:
Добавьте это к методу загрузки страницы
protected void Page_Load(object sender, EventArgs e)
{
TextBox1.Attributes.Add("readonly", "readonly");
}
Попросите свой другой элемент управления сохранить значение в скрытом поле, а при обратной передаче вытащите значение из скрытого поля и вставьте его в текстовое поле на стороне сервера.
txtStartDate.Attributes.Add("readonly", "readonly");
в pageload в лучших лучших решениях вместо Javascripts, скрытых переменных, кеш, куки, сеансах и кэшах.
Получить значение с помощью Request.Form[txtDate.UniqueID]
. Вы получите его!
У меня была эта же проблема, но с использованием "привязки привязки нокаута" и ASP.NET Server Control Text.
Таким образом:
<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>
Вот способ сделать это с помощью javascript в событии onfocus самого текстового поля.
Выполнение этого с помощью javascript имеет то преимущество, что вам не нужно делать это в коде позади, что может быть затруднено, если вам нужно сделать это в gridviews или аналогичном.
Этот код javascript тестируется только в Internet Explorer, и некоторые его части будут работать только в IE, например, например, часть createTextRange, которая предназначена только для того, чтобы сделать кареткой в начале текста в текстовом поле, но эта часть может быть пропущена, если не нужна.
Если ядро этой методики работает в других браузерах, тогда должно быть возможно сделать перекрестный браузер кода. Ядром идеи здесь является размытие после установки readonly, а затем тайм-аут, чтобы снова установить фокус.
Если вы только устанавливаете readonly, то он не переходит в readonly, пока следующий раз, когда вы отдаете фокус Textbox.
И, конечно, код можно поместить в функцию, которая вызывается с аргументом "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 текстового поля значение false ContentEditable = "false". Это не позволит вам редактировать содержимое текстового поля т.е. будет делать текстовое поле только для чтения и также добавит значение в текстовое поле после обратной передачи. Я думаю, что это самый простой способ сделать это.