Статьи

ASP.NET — управление состоянием на стороне клиента — скрытые поля

В предыдущих статьях этой серии я представил управление состоянием на стороне клиента и один из его методов — ViewState . Сегодня я собираюсь углубиться в технику скрытых полей. Как упоминалось в предыдущем посте , ViewState сохраняет свое состояние в скрытом поле.

Что такое скрытые поля?

Техника скрытых полей широко используется в программировании ASP.NET. Скрытые поля — это элемент управления вводом html со скрытым типом, который хранит скрытые данные в html. Пример для скрытого поля может выглядеть так:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />

В приведенном выше примере я решил показать скрытое поле цели события, чтобы указать, что даже в механизме обратной передачи используются скрытые поля. Данные, хранящиеся в скрытом поле, доступны, когда форма обрабатывается на сервере или когда мы используем javascript.

Значения скрытых полей

Скрытые поля хранят только одно значение в свойстве value. Значение сохраняется в виде строки, поэтому для использования его для других типов необходимо выполнить приведение. Данные скрытых полей отправляются на сервер только в режиме HTTP post. Вы можете легко увидеть сохраненные данные, используя операцию просмотра исходного кода в браузере. Вы можете увидеть его, щелкнув правой кнопкой мыши и выбрав в меню пункт «Просмотр источника» (если операция доступна). Не используйте скрытые поля для хранения конфиденциальных данных! Значения имеют контекст страницы, и поэтому, когда вы покидаете страницу, данные, хранящиеся в скрытых полях, удаляются.

Скрытые поля управления сервером

Существует два типа скрытых полей серверного элемента управления — System.Web.UI.WebControls.HiddenField и System.Web.UI.HtmlControls.HtmlInputHidden. Оба типа имеют одно и то же основное свойство Value для хранения значения скрытого поля. Вы должны выбирать между этими типами всякий раз, когда вам нужно использовать скрытое поле на стороне сервера (Примечание. Разница между HtmlControls и WebControls не в контексте этого поста). Если вы не используете серверные элементы управления, вы можете использовать Request.Form NameValueCollection, чтобы получить значение скрытого поля, указав
идентификатор клиента скрытого поля. Например, приведенный ниже код вернет строковое значение скрытого поля __EVENTTARGET:

string eventTarget = Request.Form["__EVENTTARGET"];

Пример скрытых полей

Я получил несколько запросов на пример того, как использовать скрытые поля внутри веб-форм. Пример очень прост для понимания. У меня есть ввод html со скрытым типом. В первом запросе я заполняю ввод значением сообщения с помощью функции javascript. Я использую элемент управления кнопки, чтобы сделать сообщение обратно на сервер, а в сообщении назад значение скрытого
поля вставляется в элемент управления меткой. Обратите внимание, что, поскольку я использую скрытое поле html, которое не является серверным элементом управления после второго сообщения, его значение будет пустым. Единственная причина, по которой метка все равно будет отображать сообщение, заключается в том, что 
значение по умолчанию EnableViewState для метки равно true. Код веб-страницы:

<%@ Page="" Language="C#" AutoEventWireup="true" Codebehind="Default.aspx.cs"    Inherits="AJAXEnabledWebApplication1._Default" EnableSessionState="False" %>   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">   <head runat="server">      <title>Untitled Page</title>      <script type="text/javascript">        function PutHtmlHiddenFieldValue(message)        {          var hidden = document.getElementById('HTMLHiddenField');          if (hidden != null)          {            hidden.value = message;          }        }      </script>   </head>   <body dir="ltr">      <form id="form1" runat="server">        <div>         <div>            <asp:Label ID="lblHTMLHiddenField" runat="server"></asp:Label>            <input id="HTMLHiddenField" type="hidden" name="HTMLHiddenField"/>         </div>         <div>            <asp:Button ID="btnForPostBack" runat="server" Text="Do Postback" />         </div>        </div>      </form>   </body>  </html>

На стороне сервера:

public partial class _Default : System.Web.UI.Page   {        #region Consts         private const string SCRIPT_KEY = "HtmlHiddenFieldScript";         #endregion         #region Page Events         protected void Page_Load(object sender, EventArgs e)        {            // Insert message to the label of the html control hidden            // field if there is a value in the html hidden field            string message = Request.Form["HTMLHiddenField"];            if (!string.IsNullOrEmpty(message))            {               lblHTMLHiddenField.Text = message;            }        }         protected void Page_PreRender(object sender, EventArgs e)        {            // Register a startup script in order to fill the html            // hidden field with a message value            if (!ClientScript.IsClientScriptBlockRegistered("HtmlHiddenFieldScript") &&             !IsPostBack)            {               ClientScript.RegisterStartupScript(typeof(Page), SCRIPT_KEY,                     "PutHtmlHiddenFieldValue('Html hidden hello world');", true);            }        }         #endregion   }

Резюме

Подводя итог, сегодня я углубился в технику скрытых полей. Этот метод очень популярен и широко используется в ASP.NET. В следующем посте я продолжу обзор методов управления состоянием на стороне клиента.