Кроме модели User, которая имеет дело с пользователями, у нас есть ряд дополнительных моделей, которые играют некую вспомогательную роль, описывают некоторую дополнительную информацию. Например, модель Category описывает категорию проблемы, модель Department описывает отдел, в котором работает человек. Эти модели не являются центральными для системы, в отличие от классов User или Request, однако все равно нужны нам для описания полной информации об объектах.
Вся подобная информация будет организована в виде справочников, которые будет заполнять администратор и которые будут доступны только ему.
Начнем с создания справочника для отделов. Добавим в проект новый контроллер ServiceController. Удалим из него автоматически сгенерированный метод Index. Он нам не нужен. И добавим методы для управления отделами (то есть моделью Department):
using System; using System.Collections.Generic; using System.Linq; using System.Data.Entity; using System.Web; using System.Web.Mvc; using HelpDeskTrain.Models; namespace HelpDeskTrain.Controllers { [Authorize (Roles="Администратор")] public class ServiceController : Controller { HelpdeskContext db = new HelpdeskContext(); [HttpGet] public ActionResult Departments() { ViewBag.Departments=db.Departments; return View(); } //Добавление отдела с последующим их отображением [HttpPost] public ActionResult Departments(Department depo) { if (ModelState.IsValid) { db.Departments.Add(depo); db.SaveChanges(); } ViewBag.Departments = db.Departments; return View(depo); } // Удаление отдела по id public ActionResult DeleteDepartment(int id) { Department depo = db.Departments.Find(id); db.Departments.Remove(depo); db.SaveChanges(); return RedirectToAction("Departments"); } } }
Во-первых, так как данный контроллер будет виден только администратору, то мы используем атрибут [Authorize (Roles="Администратор")]
.
Поскольку в предполагаемой задаче нам надо на одном представлении и выводить все отделы, в то же время на этом же представлении
должна быть форма для создания нового объекта Department, то у нас тут есть два способа. Первый способ заключается в типизации представления моделью
IEnumerable<Department>
, так как из контроллера в представление передаем список отделов в качестве модели, а из представления на контроллер мы тогда посылаем значение string для названия отдела и в контроллере проверяем корректность
этого значения. Второй способ состоит в том, что мы типизируем представление моделью Department
и ее передаем в post-метод для создания
нового объекта, а сам список для вывода из контроллера в представление передаем через ViewBag. Воспользуемся вторым способом.
Здесь простые действия на просмотр списка отделов, их добавление и удаление. При желание можно еще добавить редактирование. Теперь добавим для действия Departments представление Departments.cshtml:
@model Department @using HelpDeskTrain.Models @{ ViewBag.Title = "Отделы"; } <h2>Отделы</h2> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Новый отдел</legend> <div class="editor-label"> @Html.LabelFor(model => model.Name) </div> <div class="editor-field"> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div> <p><input type="submit" value="Учесть" /></p> </fieldset> } <table> @foreach (Department item in ViewBag.Departments) { <tr> <td>@item.Id</td> <td>@item.Name</td> <td>@Html.ActionLink("Удалить", "DeleteDepartment", new { id=item.Id })</td> </tr> } </table>