Передача данных в контроллер

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Ранее мы посмотрели, как передавать отдельные единичные данные и отдельные объекты моделей в методы действия контроллера в качестве параметров. Однако в реальности может возникнуть задача, передавать в метод не один элемент типа 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 в метод, то она должна иметь точно такое же имя, а не произвольное.

Таким образом, мы можем передать на сервер два разных объекта одной модели.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850