Теоретическая часть.
Контроллеры часто нуждаются в доступе к данным из входящего запроса, таким как значения строки запроса, значения формы и параметры, извлеченные из URL системой маршрутизации. Существуют три основных способа доступа к таким данным:
- извлечение данных из набора объектов контекста;
- передача данных в качестве параметров методу действия;
- явное обращение к средству привязки моделей инфраструктуры.
В этой статье мы рассмотрим подходы к получению исходных данных для методов действий, концентрируя основное внимание на объектах контекста и параметрах методов действий.
Получение данных из объектов контекста
Когда вы создаете контроллер путем его наследования от базового класса Controller, то получаете в свое распоряжение набор удобных свойств для доступа к информации, касающейся запроса. К таким свойствам относятся Request, Response, RouteData, HttpContext и Server. Каждое перечисленное свойство отвечает за конкретный аспект запроса. Мы называем их удобными свойствами, поскольку каждое из них извлекает определенный тип данных из экземпляра ControllerContext для запроса (который доступен через свойство Controller.ControllerContext).
Наиболее часто используемые объекты контекста и свойства описаны в таблице ниже:
Свойство | Тип | Описание |
---|---|---|
Request.QueryString | NameValueCollection | Переменные GET, отправленные с этим запросом |
Request.Form | NameValueCollection | Переменные POST, отправленные с этим запросом |
Request.Cookies | HttpCookieCollection | Cookie-наборы, отправленные браузером с этим запросом |
Request.HttpMethod | string | Метод HTTP (команда наподобие GET или POST), используемый для этого запроса |
Request.Headers | NameValueCollection | Полный набор заголовков HTTP, отправленных с этим запросом |
Request.Url | Uri | Элемент RouteTable.Routes, выбранный для этого запроса |
Request.UserHostAddress | string | IP-адрес пользователя, сделавшего этот запрос |
RouteData.Route | RouteBase | Элемент Routetable.Routes, выбранный для этого запроса |
RouteData.Values | RouteValueDictionary | Активные параметры маршрута (либо извлеченные из URL, либо стандартные значения) |
HttpContext.Application | HttpApplicationStateBase | Хранилище состояния приложения |
HttpContext.Cache | Cache | Хранилище кеша приложения |
HttpContext.Items | IDictionary | Хранилище состояния для текущего запроса |
HttpContext.Session | HttpSessionStateBase | Хранилище состояния для сеанса посетителя |
User | IPrincipal | Аутентификационная информация о вошедшем пользователе |
TempData | TempDataDictionary | Временные элементы данных, сохраненные для текущего пользователя |
Отдельные свойства, которые здесь упоминались — Request, HttpContext и т.д. — предоставляют объекты контекста. Здесь они подробно не рассматриваются (поскольку являются частью платформы ASP.NET), но следует знать, что такие объекты предоставляют доступ к полезной информации и средствам, и более подробно вы можете прочитать о них в разделе, посвященном
Метод действия может использовать любой из этих объектов контекста для получения информации о запросе, как демонстрируется в примере ниже:
Давайте попробуем получить данные описанные выше. Для этого нам понадобиться создать MVC проект.
В HomeController вывести данные из объектов контекста.
// Получить доступ к разнообразным свойствам из объектов контекста
ViewBag.userName = User.Identity.Name;
ViewBag.serverName = Server.MachineName;
ViewBag.clientIP = Request.UserHostAddress;
ViewBag.dateStamp = HttpContext.Timestamp;
// Параметры адресной строки
ViewBag.QueryString = Request.QueryString;
ViewBag.myURL = Request.Url.AbsoluteUri;
Вывести их в представлении Index.
<h1>Параметры проекта</h1>
Имя пользователя:
@ViewBag.userName
<br/>
Имя сервера:
@ViewBag.serverName
<br />
IP адрес:
@ViewBag.clientIP
<br />
dateStamp:
@ViewBag.dateStamp
<br />
QueryString:
@ViewBag.QueryString
<br>
URL:
@ViewBag.myURL
<br />
Зарегистрировать пользователя и посмотреть отобразится ли его имя в параметрах контекста.
Давайте получим Get параметры из адресной строки.
public ActionResult Index(string city)
Добавим в индекс метод параметр string city
Изменим адресную строку и добавим GET параметр
http://localhost:3509/Home/Index?city=city
Выведем его в Index представлении через ViewBag
Создадим форму и получим пост параметры и отобразим их.
<form method='post'> <div class="form-group"> <label for="email">Email address:</label> <input type="email" name='email' class="form-control" id="email"> </div> <div class="form-group"> <label for="pwd">Password:</label> <input type="password" name='password' class="form-control" id="pwd"> </div> <div class="checkbox"> <label><input type="checkbox"> Remember me</label> </div> <button type="submit" class="btn btn-default">Submit</button> </form>
В контроллере добавьте метод для обработки post данных
[HttpPost] public ActionResult Index() { // Получить доступ к разнообразным свойствам из объектов контекста ViewBag.email = Request.Form["email"]; ViewBag.password = Request.Form["password"]; return View(); }
Отобразите в представлении пароль и емайл
email: @ViewBag.email <br> password: @ViewBag.password
Работа с Cookie
Задать значение куки
var userCookie =new HttpCookie(«user», «Алексей»);
userCookie.Expires.AddDays(365);
HttpContext.Response.Cookies.Add(userCookie);
Стереть куки
var user = new HttpCookie("user") { Expires = DateTime.Now.AddDays(-1), Value = null }; Response.Cookies.Add(user);
ViewBag.CookieEmail = Request.Cookies[«email»].Value;
Отобразите значение куки email.
Работа с сессиями
Session[«name»] = «Tom»;
Создание AJAX формы в ASP.NET
Казалось бы, зачем в данном случае Ajax, если мы можем, например, в форму вводить имя автора и отправлять на сервер, а сервер в качестве ответа возвратит нам страницу с нужным результатом. Но, как выше уже говорилось, AJAX поможет нам избежать перезагрузки всей страницы и выполнить загрузку данных в асинхронном режиме, что несомненно повышает производительность приложения.
Установим AJAX
Install-Package Microsoft.jQuery.Unobtrusive.Ajax
Добавим AJAX форму.
<div class="jumbotron"> <h1>Параметры проекта</h1> @using (Ajax.BeginForm("myAJAX", new AjaxOptions { UpdateTargetId = "results" })) { <input type="text" name="name" /> <input type="submit" value="Поиск" /> } <div id="results"></div> </div> @Scripts.Render("~/scripts/jquery-1.10.2.min.js") @Scripts.Render("~/scripts/jquery.unobtrusive-ajax.min.js")
Добавим код для обработки AJAX в Home контроллер
[HttpPost] public ActionResult myAJAX(string name) { ViewBag.Message = name; return PartialView(""); }
Добавим частичное представление для отображения результатов AJAX
Протестируем форму.