Формы html представляют одну из форм передачи наборов данных на сервер. Обычно для создания форм и их элементов в MVC применяются либо html-хелперы, либо tag-хелперы, которые рассматриваются далее. Однако в данном случае мы рассмотрим взаимодействие на примере стандартных тегов html, которые создают элементы формы.
В одной из прошлых тем было рассмотрено, как MVC связывает отправленные значения формы с параметрами метода. Например, у нас есть действие Index:
public class HomeController : Controller { [HttpGet] public IActionResult Index() => View(); [HttpPost] public string Index(string username) => $"User Name: {username}"; }
Одно действие расщеплено на два метода: GET-версию, которая отдает представление с формой ввода, и POST-версию, которая принимает введенные в эту форму данные.
Теперь создадим само представление. Пусть в папке Views/Home есть представление Index.cshtml со следующим кодом:
<h2>User Name Form</h2> <form method="post"> <label>User Name:</label><br /> <input type="text" name="username" /><br /> <input type="submit" value="Send" /> </form>
Чтобы инфраструктура MVC могла автоматически связать данные из формы с параметрами метода, значения атрибутов name у полей формы совпадают с именами параметров.
Таким образом, когда форма отправится на сервер, при обработке запроса фреймворк MVC автоматически свяжет значения полей формы с параметрами:
В HTML мы можем использовать ряд встроенных элементов. Для ввода строк используется элементы <input type="text" />
(для однострочного текста)
и textarea
(для многострочного текста).
Для ввода парольной информации можно применять элемент <input type="password" />
Для ввода чисел (которые соответствуют типа int, short, byte, long, float, double) используется элемент <input type="number" />
Например, метод принимает ряд значений:
public class HomeController : Controller { [HttpGet] public IActionResult Index() => View(); [HttpPost] public string Index(string username, string password, int age, string comment) { return $"User Name: {username} Password: {password} Age: {age} Comment: {comment}"; } }
Тогда форма в представлении могла бы выглядеть следующим образом:
<h2>User Form</h2> <form method="post"> <p> <label>User Name:</label><br /> <input type="text" name="username" /> </p> <p> <label>Password:</label><br /> <input type="password" name="password" /> </p> <p> <label>Age:</label><br /> <input type="number" name="age" /> </p> <p> <label>Comment:</label><br /> <textarea name="comment"></textarea> </p> <p> <input type="submit" value="Send" /> </p> </form>
Для передачи логических значений true или false удобно использовать элемент <input type="checkbox" />
. Например, пусть метод принимает
объект типа bool
:
public class HomeController : Controller { [HttpGet] public IActionResult Index() => View(); [HttpPost] public string Index(bool isMarried) => $"isMarried: {isMarried}"; }
Тогда мы могли бы определить следующий элемент input:
<form method="post"> <label>Is Married:</label> <input type="checkbox" name="isMarried" value="true"/><br /><br /> <input type="submit" value="Send" /> </form>
Для связи с параметром метода элемент input называется по имени параметра - isMarried
. И, кроме того, это поле имеет по умолчанию значение true
.
Это значение необязательно указывает, что параметр isMarried
будет равен true
.
Радиокнопки или переключатели позволяют выбрать один из нескольких вариантов. Для их создания используется элемент <input type="radio" />
:
<form method="post"> <input name="color" type="radio" value="red" /> <span>red</span> <br /> <input name="color" type="radio" value="blue" /> <span>blue</span> <br /> <input checked="checked" name="color" type="radio" value="green" /> <span>green</span> <p> <input type="submit" value="Send" /> </p> </form>
Все радиокнопки имеют одинаковое имя - color и отличаются только значением, которое хранится в атрибуте value. В контроллере мы могли бы получить выбранное значение в виде обычной строки:
public class HomeController : Controller { [HttpGet] public IActionResult Index() => View(); [HttpPost] public string Index(string color) => $"color: {color}"; }
Элемент select
предназначен для создания двух видов списков - выпадающих и развернутых.
В выпадающем списке мы можем выбрать один элемент:
<form method="post"> <p> <label for="language">Выберите язык:</label> <select name="language"> <option value="csharp">C#</option> <option value="vbnet">Visual Basic.NET</option> <option value="fsharp">F#</option> <option value="typescript">TypeScript</option> </select> </p> <p> <input type="submit" value="Отправить" /> </p> </form>
При этом отображаемый текст элемента списка необязательно должен совпадать с его значением. Например:
<option value="csharp">C#</option>
Здесь текст "C#" - это то, что мы увидим в списке, а "csharp" - это значение, которое при выборе данного элемента отправится на сервер.
Чтобы получить выбранный в этом списке элемент, параметр метода контроллера должен называться также, как и элемент select:
[HttpPost] public string Index(string language) => $"Language: {language}";
Для создания списка со множественным выбором к элементу select добавляется атрибут multiple
:
<form method="post"> <p> <label for="language">Выберите язык:</label> <select multiple name="languages"> <option value="csharp">C#</option> <option value="vbnet">Visual Basic.NET</option> <option value="fsharp">F#</option> <option value="typescript">TypeScript</option> </select> </p> <p> <input type="submit" value="Отправить" /> </p> </form>
Но теперь, чтобы получить все выбранные значения в этом списке, метод контроллера должен в качестве параметра принимать массив или список:
public class HomeController : Controller { [HttpGet] public IActionResult Index() => View(); [HttpPost] public string Index(string[] languages) { string result = "Вы выбрали:"; foreach (string lang in languages) { result = $"{result} {lang};"; } return result; } }