Литмир - Электронная Библиотека

Согласно этим правилам создадим папку Admin в папке Views, в которую через контекстное меню добавим представление Index (рис. 4.4).

Asp.net mvc framework - img_24

Рис. 4.4. Пункт меню, позволяющий добавить новое представление

Asp.net mvc framework - img_25

Рис. 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.

Asp.net mvc framework - img_26

Рис. 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).

Asp.net mvc framework - img_27

Рис. 4.7. Форма редактирования данных пользователя

C помощью этой формы и действий, реализованных в нашем контроллере, вы сможете модифицировать данные пользователя либо удалить его из системы.

Архитектура контроллеров

Мы рассмотрели простейший вариант создания контроллеров и их действий, а также сопоставленных с ними представлений. Но архитектура MVC Framework помимо рассмотренных механизмов содержит массу больших и малых механизмов, которые позволяют регулировать контроллеры, управлять вызовами кода, защищать контроллеры и действия от нежелательных вызовов, формировать базовые архитектуры для набора действий или даже группы контроллеров.

20
{"b":"971383","o":1}