Согласно этим правилам создадим папку Admin в папке Views, в которую через контекстное меню добавим представление Index (рис. 4.4).
Рис. 4.4. Пункт меню, позволяющий добавить новое представление
Рис. 4.5. Окно создания нового представления
В окне Add View (рис. 4.5) необходимо указать название представления (без расширения файла), остальные параметры пока оставьте без изменения. Добавим разметку и код для формирования представления в файле Index.aspx:
<asp:Content ID="Content2"
ContentPlaceHolderID="MainContent"
runat="server">
<h1>Список пользователей</h1>
<p>
<table>
<tr>
<th></th>
<th>Имя</th>
<th>Email</th>
<th>Последняя активность</th>
<th>Подтвержден</th>
<th>Заблокирован</th>
</tr>
<% foreach
(MembershipUser user in
(MembershipUserCollection)ViewData.Model) { %>
<tr>
<td><%= Html.ActionLink("Выбрать",
"Select",
new {userid = (Guid)user.ProviderUserKey}) %>
</td>
<td><%= Html.Encode(user.UserName) %></td>
<td><%= Html.Encode(user.Email) %></td>
<td><%= user.LastActivityDate %></td>
<td><%= user.IsApproved %></td>
<td><%= user.IsLockedOut %></td>
</tr>
<% } %>
</table>
</p>
</asp:Content>
Теперь мы можем запустить проект и посмотреть на результат работы. Для этого нам необходимо войти в систему под пользователем Admin и перейти по адресу http://"наш сайт"/Admin. Если вы все сделали правильно, то результатом будет примерно такой список пользователей — рис. 4.6.
Рис. 4.6. Список пользователей
Для завершения создания контроллера реализуем все остальные необходимые действия так, как показано в листинге 4.1.
Листинг 4.1. Действия контроллера AdminController
public ActionResult Select(Guid? userId)
{
if (!userId.HasValue)
throw new HttpException(404, "Пользователь не найден");
if (User.IsInRole("Administrators"))
{
MembershipProvider mp = Membership.Provider;
MembershipUser user = mp.GetUser(userId, false);
ViewData.Model = user;
return View () ;
}
else
{
return RedirectToAction("Index", "Home");
}
}
public ActionResult Update(Guid? userId,
string email,
bool isApproved,
bool isLockedOut)
{
if (!userId.HasValue)
throw new HttpException(404, "Пользователь не найден");
if (User.IsInRole("Administrators"))
{
MembershipProvider mp = Membership.Provider;
MembershipUser user = mp.GetUser(userId, false);
user.Email = email; user.IsApproved = isApproved;
if (user.IsLockedOut && !isLockedOut)
user.UnlockUser();
mp.UpdateUser(user);
return RedirectToAction("Index");
}
else
{
return RedirectToAction("Index", "Home");
}
}
public ActionResult Delete(Guid? userId)
{
if (!userId.HasValue)
throw new HttpException(404, "Пользователь не найден");
if (User.IsInRole("Administrators"))
{
MembershipProvider mp = Membership.Provider;
MembershipUser user = mp.GetUser(userId, false);
mp.DeleteUser(user.UserName, true);
return RedirectToAction("Index");
}
else
{
return RedirectToAction("Index", "Home");
}
}
В листинге 4.1 определено три действия для отображения данных конкретного пользователя, удаления данных и сохранения новых данных. Обратите внимание, что действия Update и Delete не возвращают сопоставленного представления, а только перенаправляют запрос на вызов других действий с имеющимися представлениями. Только действие Select возвращает сопоставленное представление. Давайте создадим соответствующее представление для контроллера Admin, назвав его Select, и определим его следующим образом:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent"
runat="server">
<%=Html.ActionLink("Вернуться в список", "Index")%>
<% MembershipUser user = (MembershipUser) ViewData.Model; %>
<h1>Пользователь <%= Html.Encode(user.UserName) %></h1>
<% using (Html.BeginForm("Update", "Admin")) { %>
<%= Html.Hidden("userId", (Guid)user.ProviderUserKey) %>
<fieldset>
<legend>Данные</legend>
<p>
<label for="email">Email</label>
<%=Html.TextBox("email", user.Email)%>
</p>
<p>
<label for="isApproved"><%=Html.CheckBox("isApproved",
user.IsApproved)%>подтвержден</label>
</p>
<p>
<label for="isLockedOut"><%=Html.CheckBox("isLockedOut",
user.IsLockedOut)%>заблокирован</label>
</p>
</fieldset>
<input type="submit" value="Сохранить" />
<%=Html.ActionLink("Удалить", "Delete", new {userId = (Guid)
user.ProviderUserKey})%>
<% } %>
</asp:Content>
Когда вы запустите проект, то после входа под логином Admin и перехода на страницу администрирования, вы сможете выбирать пользователей путем перехода по ссылкам Выбрать. После такого перехода для пользователя User вы должны увидеть следующую форму (рис. 4.7).
Рис. 4.7. Форма редактирования данных пользователя
C помощью этой формы и действий, реализованных в нашем контроллере, вы сможете модифицировать данные пользователя либо удалить его из системы.
Архитектура контроллеров
Мы рассмотрели простейший вариант создания контроллеров и их действий, а также сопоставленных с ними представлений. Но архитектура MVC Framework помимо рассмотренных механизмов содержит массу больших и малых механизмов, которые позволяют регулировать контроллеры, управлять вызовами кода, защищать контроллеры и действия от нежелательных вызовов, формировать базовые архитектуры для набора действий или даже группы контроллеров.