В предыдущих версиях ASP.NET 1.x элемент управления TextBox, для которого установлено значение ReadOnly, все равно мог получить измененное значение на стороне сервера после того, как значение было изменено на стороне клиента. Однако в ASP.NET 2.0 эта практика была ограничена. . Считается, что это повышает безопасность приложений. Ниже приведен внутренний метод элемента управления TextBox для получения данных, из которого мы видим ограничения ReadOnly:
protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
base.ValidateEvent(postDataKey);
строка text1 = this.Text;
строка text2 = postCollection[postDataKey];
if (!this.ReadOnly && !text1.Equals(text2, StringComparison.Ordinal))
{
this.Text = text2;
вернуть истину;
}
вернуть ложь;
}
Здесь ограничен только атрибут Text, и нет ограничений на NameValueCollection имени/значения отправленных данных. Таким образом, значение по-прежнему можно получить с помощью метода Request["Form Name"]. Следующий пример полностью иллюстрирует этот момент и предоставляет способ использовать ReadOnly и получить значение через свойство Text:
<%@ Page Language="C#" EnableViewState="false" %>
<!DOCTYPE html PUBLIC "-/ /W3C/ /DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<script runat="server">
protected void Button1_Click(object sender, EventArgs e )
{
Response.Write("<li>TextBox1 = " + TextBox1.Text);
Response.Write("<li>TextBox2 = " + TextBox2.Text);
Response.Write("<li>TextBox3 = " + TextBox3.Text);
Response.Write("<li>Request.Form[TextBox1] = " + Request.Form[TextBox1.UniqueID]);
Response.Write("<li>Request.Form[TextBox2] = " + Request.Form[TextBox2.UniqueID]);
Response.Write("<li>Request.Form[TextBox3] = " + Request.Form[TextBox3.UniqueID]);
}
protected void Page_Load (отправитель объекта, EventArgs e)
{
TextBox3.Attributes.Add("только для чтения", "только для чтения");
}
</script>
<тип сценария="текст/javascript">
//<![CDATA[
функция УстановитьНовоеЗначение()
{
document.getElementById('<%=TextBox1.ClientID %>').value = "Новое значение TextBox1";
document.getElementById('<%=TextBox2.ClientID %>').value = "Новое значение TextBox2";
document.getElementById('<%=TextBox3.ClientID %>').value = "Новое значение TextBox3";
}
//]]>
</script>
<html xmlns=" http://www.w3.org/1999/xhtml ">
<head runat="сервер">
<title>Элемент управления TextBox и свойства ReadOnly и Enabled в ASP.NET 2.0</title>
</голова>
<тело>
<form id="form1" runat="server">
<span>TextBox1 Только для чтения:</span>
<asp:TextBox ID="TextBox1" runat="server" ReadOnly="True" Text="TextBox1 Old Value"></asp:TextBox><br />
<span>TextBox2 Включено:</span>
<asp:TextBox ID="TextBox2" runat="server" Enabled="False" Text="TextBox2 Old Value"></asp:TextBox><br />
<span>TextBox3 Только для чтения:</span>
<asp:TextBox ID="TextBox3" runat="server" Text="TextBox3 Old Value"></asp:TextBox><br />
<бр />
<asp:Button ID="Button2" runat="server" Text="Изменить новое значение" OnClientClick="SetNewValue(); return false;"
<asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Click" />
</форма>
</тело>
</html>
Для отключенного TextBox измененное значение невозможно получить на стороне сервера. Если вы действительно хотите использовать этот атрибут, используйте для этого метод скрытия поля формы.
TextBox с атрибутом ReadOnly будет отображаться как такая отметка на стороне клиента:
<input readonly="readonly">
TextBox с атрибутом Enabled будет отображаться как такая метка на стороне клиента: <input Disabled="disabled" «>
Согласно спецификациям W3C: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.12
Ввод, для которого установлено значение «отключено», будет иметь следующие ограничения:
· Невозможно получить фокус · Будет пропущен при использовании клавиши табуляции · Не может быть успешным. Успешные
входные данные, установленные только для чтения, будут иметь следующие ограничения:
· Могут получать фокус, но не могут быть изменены · Можно использовать клавишу табуляции для навигации · Могут быть успешными
Только успешные элементы формы являются действительными данными, т. е. их можно подать. Атрибут значения отключенных и доступных только для чтения полей ввода текста можно изменить только с помощью сценариев.