Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Ранее мы посмотрели, как передавать отдельные единичные данные и отдельные объекты моделей в методы действия контроллера в качестве параметров.
Однако в реальности может возникнуть задача, передавать в метод не один элемент типа int
или один объект какого-то класса, а несколько
объектов. Давайте разберем возможные случаи.
Определим следующую форму в представлении:
@using (Html.BeginForm()) { @Html.TextBox("names") @Html.TextBox("names") @Html.TextBox("names") @Html.TextBox("names") <input type="submit" /> }
Таким образом, у нас в html-разметке будет создано четыре элемента input
<form action="/Home/Array" method="post"> <input id="names" name="names" type="text" value="" /> <input id="names" name="names" type="text" value="" /> <input id="names" name="names" type="text" value="" /> <input id="names" name="names" type="text" value="" /> <input type="submit" /> </form>
И при отправке формы у нас будет формироваться коллекция из names
, состоящая из четырех элементов. И в действии контроллера
мы сможем получить все эти элементы:
[HttpPost] public string Array(List<string> names) { string fin=""; for (int i = 0; i < names.Count; i++) { fin += names[i] + "; "; } return fin; }
Допустим, мы передаем в представление массив объектов некоторой модели в представление, например, модели Book
:
[HttpGet] public ActionResult Add() { var allbooks = db.Books.ToList<Book>(); return View(allbooks); }
Чтобы вывести объекты для редактирования в представление мы можем использовать следующую конструкцию:
@model List<Mvc4BasicApplication.Models.Book> ....................................... @using (Html.BeginForm()) { for(int i=0; i<Model.Count; i++) { <h4>Книга № @(i+1)</h4> @: Name: @Html.EditorFor(m=>m[i].Name) @: Author: @Html.EditorFor(m => m[i].Author) @: Year: @Html.EditorFor(m => m[i].Year) } <input type="submit" /> }
Таким образом, мы сгенерируем для каждого объекта набор полей для редактирования его свойств. И после нажатия кнопки весь данный массив отправится на сервер, где мы его можем получить таким образом:
[HttpPost] public string Add(List<Book> books) { //........................ }
В предыдущем случае мы передавали коллекцию объектов модели Book
. Но у нас может возникнуть ситуация, когда мы должны разграничить
как-то переданные объекты. Например, метод контроллера выглядит так:
[HttpPost] public string Add(Book book, Book myBook) { //........................ }
Мы используем два отдельных объекта Book. Как мы можем передать их из представления в контроллер? Допустим, теперь, что один объект мы передаем в качестве модели представления, а другой создаем в том же представлении:
@using Mvc4BasicApplication.Models @model Book @{ ViewBag.Title = "Add"; } @{ Book myBook = new Book() { Name = "Мартин Иден", Author = "Джек Лондон", Year = 1910 }; } <h2>Книги</h2> @using (Html.BeginForm()) { @Html.EditorFor(m=>myBook) @Html.EditorForModel() <input type="submit" /> }
Одну модель мы передаем из контроллера в представление:
[HttpGet] public ActionResult Add() { Book firstBook = db.Books.ToList<Book>().First(); return View(firstBook); }
Вторую модель - myBook
мы создаем в представлении. Все поля для модели мы создаем с помощью хелпера @Html.EditorFor(m=>myBook)
.
Обратите внимание на имя модели - myBook. Поскольку мы ожидаем, что данная модель должна передаваться в качестве параметра myBook
в метод,
то она должна иметь точно такое же имя, а не произвольное.
Таким образом, мы можем передать на сервер два разных объекта одной модели.