Передача сложных объектов




Передача данных методом GET

Передавать значения для параметров можно различными способами. При отправке GET-запроса значения передаются через строку запроса. Стандартный get-запрос принимает примерно следующую форму: название_ресурса?параметр1=значение1&параметр2=значение2. Например, определим следующий метод:

  publicstringHello(intid) { return$"id= {id}"; }

Чтобы передать значение для параметра id, нам надо отправить запрос типа https://localhost:57086/Home/Hello/9

Если метод принимает несколько параметров:

  publicstringSquare(inta, inth) { doubles = a * h / 2; return$"Площадь треугольника с основанием {a} и высотой {h} равна {s}"; }

В этом случае мы можем обратиться к действию, набрав в адресной строке Home/Square?a=10&h=3, и приложение выдало бы нам нужный результат.

Если же мы не используем параметры в строке запроса, то для параметров будут передаваться значения по умолчанию. Например, при отправке запроса Home/Square/ параметры a и h будут равны 0. Но на случай подобной ситуации мы можем использовать параметры по умолчанию, которые будут работать, если через строку запроса не передается никаких параметров:

  publicstringSquare(inta = 3, inth = 10) { doubles = a * h / 2; return$"Площадь треугольника с основанием {a} и высотой {h} равна {s}"; }

Передача сложных объектов

Хотя строка запроса преимущественно используется для передачи данных примитивных типов, но мы также можем принимать более сложные объекты. Например, определим рядом с контроллером класс Geometry:

  publicclassHomeController: Controller { publicstringSquare(Geometry geometry) { return$"Площадьтреугольникасоснованием {geometry.Altitude} ивысотой {geometry.Height} равна {geometry.GetSquare()}"; }   // остальноесодержимое } publicclassGeometry { publicintAltitude { get; set; } // основание publicintHeight { get; set; } // высота   publicdoubleGetSquare() // вычисление площади треугольника { returnAltitude * Height / 2; } }

Класс Geometry определяет два свойства и метод для подсчета площади. И теперь в контроллере метод Square принимает параметр типа Geometry. Как в этом случае мы можем передать контроллеру данные? Для этого нам надо отправить запрос наподобие следующего https://localhost:57086/Home/Square?altitude=10&height=3. Здесь параметры строки запроса должны соответствовать по имени свойствам объекта. Регистр названий при этом не учитывается:

Передача массивов

Допустим, метод принимает массив чисел:

  publicstringSum(int[] nums) { return$"Суммачиселравна {nums.Sum()}"; }

Чтобы передать значения для массива, нам надо использовалась строку запроса наподобие https://localhost:57086/Home/Sum?nums=1&nums=2&nums=3. В этом случае в массиве nums окажется три элемента.

Теперь изменим метод Sum, чтобы он принимал массив объектов ранее созданного класса Geometry:

  publicstringSum(Geometry[] geoms) { return$"Суммаплощадейравна {geoms.Sum(g=>g.GetSquare())}"; }

Данный метод подсчитывает сумму всех площадей в массиве geoms. И чтобы передать в этот метод данные, нам надо использовать запрос типа https://localhost:57086/Home/Sum?geoms[0].altitude=10&geoms[0].height=3&geoms[1].altitude=16&geoms[1].height=2. В этом случае в массиве geoms будут два элемента Geometry.

 

Передачаданных

using System;

 

namespaceHelperMethods.Models

{

public class User

{

publicintUserId { get; set; }

public string FirstName { get; set; }

public string LastName { get; set; }

publicDateTimeBirthDate { get; set; }

public Address HomeAddress { get; set; }

public bool IsApproved { get; set; }

public Role Role { get; set; }

}

Тип User будет служить классом модели представления во время исследования вспомогательных методов, связанных с формами,

Это стандартный подход с двумя методами к работе с HTML-формами, при котором мы полагаемся на привязку моделей ASP.NET MVC Framework в создании объекта User из данных формы и передаче его методу действия с атрибутом HttpPost.

Мы никак не обрабатываем данные из формы, поскольку хотим сосредоточиться на том, как генерировать элементы в представлении. Метод действия с атрибутом HttpPost просто вызывает метод View() и передает ему объект User, получаемый в качестве параметра, что в результате приводит к отображению данных формы пользователю.

Это представление содержит стандартную вручную созданную форму, в которой значения атрибута value элементов <input> устанавливаются с использованием объекта модели.

Обратите внимание, что атрибуты name всех элементов <input> установлены в соответствие со свойствами модели, которые эти элементы отображают. Атрибут name применяется стандартным связывателем моделей ASP.NET MVC Framework для выяснения того, какие элементы <input> содержат значения для свойств типа модели, при обработке запроса POST. Если опустить атрибут name, форма не будет корректно функционировать.

 

Передача коллекции

Определим следующую форму в представлении:

  <formaction="/Home/Array"method="post"> <inputid="names"name="names"type="text"value=""/> <inputid="names"name="names"type="text"value=""/> <inputid="names"name="names"type="text"value=""/> <inputid="names"name="names"type="text"value=""/> <inputtype="submit"/> </form>

Поэтому при отправке формы будет формироваться коллекция из names, состоящая из четырех элементов. И в методе контроллера мы сможем получить все эти элементы:

  [HttpPost] publicstringArray(List<string> names) { stringfin=""; for(inti = 0; i<names.Count; i++) { fin += names[i] + "; "; } returnfin; }

 

 

Передача сложных объектов

У нас есть следующая модель:

  publicclassBook { publicintId { get; set; } publicstringName { get; set; } } publicclassAuthor { publicintId { get; set; } publicstringName { get; set; } publicICollection<Book> Books { get; set; } }

Модель автора содержит ссылку на коллекцию книг. В контроллере мы получаем эту модель:

publicActionResult Index(Author author)

{

 

returnView(author);

}

Тогда представление могло бы выглядеть так:

  @model ArrayPostApp.Models.Author   <h2>Добавлениекниг</h2>   @using(Html.BeginForm()) { @Html.AntiForgeryToken() <div class="authorBlock"> <label>Имяавтора</label> <input type="text"name="name"/> </div> <div id="booksBlock"> <div class="bookItem"> <h4>Книга № 1</h4> <div> <label>Название</label> <div> <input type="text"name="Books[0].name"/> </div> </div> </div>   </div> <p><a class="addLink">Добавитьновыйэлемент</a></p> <p><input type="submit"value="Добавить"/></p> }   @section Scripts { <script> $(function () { vari = 0; $('.addLink').click(function() { i++; var html2Add= "<div class='bookItem'>"+ "<h4>Книга № "+(i+1) + "</h4>"+ "<div><label>Название</label><div>"+ "<input type='text' name='Books["+i+"].name' />"+ "</div></div></div>"; $('#booksBlock').append(html2Add); }) }) </script> }

Так как модель Author содержит набор книг в свойстве Books, то атрибут name соответствующих текстовых элементов должно иметь следующую форму: name="Books[0].name". С помощью кода javascript мы можем динамически добавить новые элементы:

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: