Куки сессии POST GET и Ajax в MVC. Урок 6. MVC ASP.NET в Караганде.

Автор: | 23.02.2017

Теоретическая часть.

Контроллеры часто нуждаются в доступе к данным из входящего запроса, таким как значения строки запроса, значения формы и параметры, извлеченные из URL системой маршрутизации. Существуют три основных способа доступа к таким данным:

  • извлечение данных из набора объектов контекста;
  • передача данных в качестве параметров методу действия;
  • явное обращение к средству привязки моделей инфраструктуры.

В этой статье мы рассмотрим подходы к получению исходных данных для методов действий, концентрируя основное внимание на объектах контекста и параметрах методов действий.

Получение данных из объектов контекста

Когда вы создаете контроллер путем его наследования от базового класса Controller, то получаете в свое распоряжение набор удобных свойств для доступа к информации, касающейся запроса. К таким свойствам относятся Request, Response, RouteData, HttpContext и Server. Каждое перечисленное свойство отвечает за конкретный аспект запроса. Мы называем их удобными свойствами, поскольку каждое из них извлекает определенный тип данных из экземпляра ControllerContext для запроса (который доступен через свойство Controller.ControllerContext).

Наиболее часто используемые объекты контекста и свойства описаны в таблице ниже:

Часто используемые объекты контекста 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

Протестируем форму.