Кроме базовых html-хелперов форм в ASP.NET Core MVC можно использовать их двойники - строго типизированные хелперы. Этот вид хелперов принимает в качестве параметра делегат, через который указывается свойство модели, к которому должен быть привязан данный хелпер. Важно учитывать, что строго типизированные хелперы могут использоваться только в строго типизированных представлениях, а тип модели, которая передается в хелпер, должен быть тем же самым, что указан для всего представления с помощью директивы @model.
Посмотрим на примере. Допустим, в проекте в папке Models у нас есть следующая модель User:
namespace MvcApp.Models { public record class User(int Id, string Name, int Age); }
Для создания объекта этой модели мы могли бы использовать следующую форму:
<form method="post" action="~/Home/Create"> <p> <label>Имя</label><br /> <input type="text" name="Name" /> </p> <p> <label>Возраст</label><br /> <input type="number" name="Age" /> </p> <p> <input type="submit" value="Отправить" /> </p> </form>
Перепишем этот пример с использованием строго типизированных хелперов::
@model MvcApp.Models.User @using (Html.BeginForm("Create", "Home", FormMethod.Post)) { <p> @Html.LabelFor(m=>m.Name, "Имя")<br /> @Html.TextBoxFor(m=>m.Name) </p> <p> @Html.LabelFor(m => m.Age, "Возраст")<br /> @Html.TextBoxFor(m=>m.Age, "", new { type = "number" }) </p> <p> <input type="submit" value="Отправить" /> </p> }
Строго типизированный хелпер похож на обычный, только в конце прибавляется суффикс For: LabelFor
.
Так как строго типизированные хелперы могут использоваться только в строго типизированных представлениях, то вначале представления указываем
модель, которая будет использоваться:
@model MvcApp.Models.User
То есть, в вызове
@Html.TextBoxFor(m=>m.Name)
параметр m
представляет переменную модели User. А лямбда-выражение m=>m.Age
указывает, что данный хелпер будет генерировать поле для свойства Age
.
Таким образом, хелпер @Html.TextBoxFor(m=>m.Age, "", new { type = "number" })
сгенерирует поле:
<input data-val="true" data-val-required="The Age field is required." id="Age" name="Age" type="number" value="">
Кроме стандартных атрибутов строго типизированные хелперы также добавляют атрибуты валидации типа data-val
и data-val-required
, которые будут рассмотрены в соответствующей теме.
Для каждого базового встроенного хелпера имеется свой строго типизированный хелпер:
Html.HiddenFor
Выражение @Html.HiddenFor(m=> m.Id)
создает разметку:
<input id="Id" name="Id" type="hidden" value="[значение_m.Id]" />
Html.CheckBoxFor
Выражение @Html.CheckBoxFor(m=>m.Enable, false)
формирует элемент:
<input id="Enable" name="Enable" type="checkbox" value="true" />
Html.LabelFor
Хелпер @Html.LabelFor(m => m.Name,"Имя")
генерирует разметку:
<label for="Name">Имя</label>
Html.PasswordFor
Хелпер @Html.PasswordFor(m => m.Password)
создает разметку:
<input id="Password" name="Password" type="password" />
Html.RadioButtonFor
@Html.RadioButtonFor(m => m.Option, "val")
генерирует разметку:
<input id="Option" name="Option" type="radio" value="val" />
Html.TextBoxFor
Выражение@Html.TextBoxFor(m => m.Name)
создает разметку:
<input id="Name" name="Name" type="text" />
Html.TextAreaFor
Хелпер @Html.TextAreaFor(m => m.Name,10,9,null)
генерирует код:
<textarea cols="9" id="Name" name="Name" rows="10" ></textarea>
Html.DropDownListFor
Создает выпадающий список select с одиночным выбором для установки свойства модели
Html.ListBoxFor
Создает список select со множественным выбором для определенного свойства модели. Подходит, если свойство модели представляет массив или список