Контроллер
Контроллеры необходимы для обеспечения взаимодействия между моделью и представлением. Все контроллеры наследуются от класса Controller, который в свою очередь является наследником класса ControllerBase, реализующего интерфейс IController. Интерфейс IController имеет основной метод - Execute, который принимает параметр RequestContext, с его помощью можно выдавать в представление абсолютно любые типы данных.
Для создания контроллера, нужно создать класса реализующий интерфейс IController. При этом следует обратить внимание на именование, т.к. контроллеры тесно связаны с маршрутами. Проще говоря, если у вас есть папка представления Home (Views/Home), то имя контроллера должно быть HomeController, а для представления Admin – AdminController, и т.п. Если вы используете в качестве инструмента для разработки Visual Studio, то это не должно вызвать у вас никаких проблем.
По умолчанию у каждого контроллера вызывается функция Index. Имена функций должны соответствовать именам файлов в представлении, например, в папке Account есть файл LogOn.aspx, имя функции в контроллере для обработки этого файла будет LogOn.
Рассмотрим стандартный код функции LogOn:
public ActionResult LogOn()
{
return View();
}
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError(", "Имя пользователя или пароль указаны неверно.");
}
}
// Появление этого сообщения означает наличие ошибки; повторное отображение формы
return View(model);
}
Как видите, тут две функции LogOn. Первая предназначена для обработки методов GET и не имеет никакого функционала. Строчка кода return View; передает в представление данные из контроллера.
Вторая функция обрабатывает HTTP-метод POST, на это указывает атрибут [HttpPost] (для GET запросов тоже есть атрибут – HttpGet, однако он используется по умолчанию и указывать его не обязательно). Функция принимает два параметра – модель, и адрес возврата. Модель, как видно из названия, реализуется в модели данных – т.е. это класс. Через модель со страницы от пользователя передаются данные в котроллер.
Рассмотрим код представления:
<% using (Html.BeginForm()) { %>
<%= Html.ValidationSummary(true, "Не удалось выполнить вход. Исправьте ошибки и повторите попытку.") %>
<div>
<fieldset>
<legend>Сведения учетной записи</legend>
<div class="editor-label">
<%= Html.LabelFor(m => m.UserName) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(m => m.UserName) %>
<%= Html.ValidationMessageFor(m => m.UserName) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(m => m.Password) %>
</div>
<div class="editor-field">
<%= Html.PasswordFor(m => m.Password) %>
<%= Html.ValidationMessageFor(m => m.Password) %>
</div>
<div class="editor-label">
<%= Html.CheckBoxFor(m => m.RememberMe) %>
<%= Html.LabelFor(m => m.RememberMe) %>
</div>
<p>
<input type="submit" value="Вход" />
</p>
</fieldset>
</div>
<% } %>
Например, строк Html.TextBoxFor(m => m.UserName) - создает на странице текстовое поле и привязывает его к свойству модели - UserName.
Сам класс реализованный в модели имеет следующий вид:
public class LogOnModel
{
[Required]
[DisplayName("Имя пользователя")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[DisplayName("Пароль")]
public string Password { get; set; }
[DisplayName("Запомнить меня")]
public bool RememberMe { get; set; }
}
Здесь нужно обратить внимание на имя класса, а точнее на его вторую часть LogOnModel. Именно по такому принципу вы должны будете делать свои классы моделей, которые нужно будет передавать в представление, т.е. практически все.
© mvcnet.ru, 2010