Большая часть вспомогательных методов, приведенных в табл. 5.1, связаны с созданием HTML-разметки для элементов ввода данных HTML-форм. В этой части главы мы рассмотрим их применение.
HTML-форма
Для того чтобы данные, введенные пользователем в элементы управления, были корректно отправлены на сервер и обработаны ожидающим этих данных действием контроллера, необходимо создать тег <form>, для этого существует вспомогательный метод Html.BeginForm(действие контроллера, имя контроллера). Если при вызове метода не указаны параметры, атрибут action тега <form> будет заполнен текущим URL.
<% using(Html.BeginForm("About", "Home")){ %>
<% } %>
В примере используется синтаксис using(){}. Дело в том, что метод Html.BeginForm() возвращает объект, реализующий интерфейс IDisposable. Метод Dispose() этого объекта определен таким образом, чтобы выводить закрывающий тег формы </form>. Вместо синтаксиса using(){} можно воспользоваться вспомогательным методом Html. EndForm().
<% Html.BeginForm("About", "Home"); %>
<% Html.EndForm (); %>
Синтаксис using(){} удобнее при наличии нескольких независимых форм на странице — в этом случае формы будут выглядеть визуально обособленно.
При отображении представления будет создана соответствующая разметка для тега <form>.
<form action="/Home/About" method="post">
</form>
В случае необходимости задать дополнительные параметры URL, по которому будут отправлены данные формы, необходимо передать анонимный объект, свойства которого будут преобразованы в пары ключ-значение. Для определения метода отправки формы, в качестве параметра нужно передать значение перечислимого FormMethod.
<% using (Html.BeginForm("About", "Home",
new { hello = "world", answer = 42 }, FormMethod.Get )) { %>
<% } %>
Эти параметры будут использованы при генерации тега <form>.
<form action="/Home/About?hello=world&answer=42" method="get">
</form>
Текстовые поля, скрытые поля и кнопки
Вспомогательные методы для генерации текстовых полей, скрытых полей и кнопок работают по общему принципу — первым параметром передается идентификатор, который будет использован для создаваемого HTML-элемента и на основании которого сопоставляется значение элемента управления и создается пара ключ-значение при отправке данных формы на сервер.
<%= Html.TextArea("myText", "Hello world!") %>
В отличие от метода Html.BeginForm, выводящего строковые значения непосредственно в выходной буфер ответа пользователю, вспомогательные методы элементов управления возвращают строку, поэтому для них нужно использовать синтаксис <%= %>. Тогда в разметку страницы будет выведена соответствующая строка.
<textarea cols="20" id="myText" name="myText" rows="2">
la-la-la-la-la-la-la</textarea>
Для создания дополнительных атрибутов вспомогательным методам необходимо передать анонимный объект.
<%= Html.TextBox("myTextBox", "", new { style="color: yellow;",
@class="helloWorld" })%>
Поскольку в качестве имени свойства анонимного объекта нельзя использовать зарезервированные ключевые слова языка C#, то перед такими именами свойств нужно добавить символ @. В результирующий вывод свойство @class войдет как class, без символа @.
<input class="helloWorld" id="myTextBox"
name="myTextBox" style="color: yellow;" type="text" value="" />
Особым случаем является вспомогательный метод Html.CheckBox, поскольку он создает два HTML-элемента управления. Непосредственно элемент "флажок" и "скрытое поле".
<%= Html.CheckBox("myCheckBox", true) %>
Поскольку в случае если элемент управления не будет отмечен пользователем, то его значение на сервер не передается, поэтому необходимо использование скрытого поля.
<input checked="checked" id="myCheckBox" name="myCheckBox"
type="checkbox" value="true" />
<input name="myCheckBox" type="hidden" value="false" />
Стоит отметить, каким образом присваиваются значения элементам управления. При генерации разметки для элемента управления myTextBox механизм представления сначала проверит наличие значения в коллекции ViewData.ModelState для элемента с именем myTextBox: ViewData.ModelState["myTextBox"].Value.RawValue, затем будет использовано значение, переданное в качестве параметра вспомогательному методу. В случае если вспомогательному методу не было передано параметров, то будет осуществлена попытка найти значение в коллекции ViewData: ViewData.Eval("myTextBox"). Подробнее о коллекции ModelState рассказано в разделе, посвященном проверке значений элементов управления.
Элементы-списки
Для генерации списков используются два метода Html.DropDownList() и Html.ListBox(), генерирующие разметку для элементов: управления "выпадающий список" и "список" соответственно. Оба этих вспомогательных метода принимают в качестве параметра коллекцию SelectList.
<%= Html.DropDownList("lstName",
new SelectList( new[] {"John", "Paul", "George", "Rringo"} )) %>
В результате создается разметка, содержащая теги <option>.
<select id="lstName" name="lstName">
<option>John</option>
<option>Paul</option>
<option>George</option>
<option>Rringo</option>
</select>
Для обеспечения возможности выбора нескольких элементов в списках, генерируемых методом ListBox, в качестве параметра следует передать коллекцию MultiSelectList.
<%= Html.ListBox("lstName",
new MultiSelectList( new[] {"John", "Paul", "George", "Rringo"} )) %>
Тогда будет определено свойство multiple тега <select>.
<select id="lstName" multiple="multiple" name="lstName">
<option>John</option>
<option>Paul</option>