Создаем админ панель #2
Всех приветствую! Сегодня продолжаем реализовывать админ панель, в частности пропишем функции для удаления и редактирования статей.
Controller
Как всегда заходим начинаем нашу работу с контроллера. Здесь пропишем 5 функций, так что давайте не медлить и приступать.
Первая это просто вывод всех статей в админ панеле
public ActionResult Index()
{
IQueryable<Article> source = adb.articles.OrderBy(p => p.Id);
var articles = source.ToList();
ArticleViewModel articleViewModel = new ArticleViewModel
{
getAllArticles = articles
};
return View(articleViewModel);
}Тут вы можете заметить, что это просто скопированная функция из второго урока( где мы реализовывали вывод статей из бд ). Это логично, ведь функционал у них идентичен.
В следующую очередь мы напишем две функции для удаления статей
[HttpGet]
[ActionName("Delete")]
public async Task<IActionResult> ConfirmDelete(int? id)
{
if (id != null)
{
Article text = await adb.articles.FirstOrDefaultAsync(p => p.Id == id);
if (text != null)
return View(text);
}
return NotFound();
}
[HttpPost]
public async Task<IActionResult> Delete(int? id)
{
if (id != null)
{
Article text = await adb.articles.FirstOrDefaultAsync(p => p.Id == id);
if (text != null)
{
adb.articles.Remove(text);
await adb.SaveChangesAsync();
return RedirectToAction("Index");
}
}
return NotFound();
}Первая из них, выводит поле с текстом при нажатии на кнопку удалить. Это как бы подтверждение удаления. Вторая непосредственно удаляет выбранный по id пост и редиректит нас на функцию Index.
Ну и в конце, пара функций для редактирования содержимого постов
public async Task<IActionResult> Edit(int? id)
{
if (id != null)
{
Article text = await adb.articles.FirstOrDefaultAsync(p => p.Id == id);
if (text != null)
return View(text);
}
return NotFound();
}
[HttpPost]
public async Task<IActionResult> Edit(Article article)
{
adb.articles.Update(article);
await adb.SaveChangesAsync();
return RedirectToAction("Index");
}Первая у нас выводит содержание выбранной по id статьи, при этом проводя проверку на то что содержание этого поста не равно 0. Вторая функция обновляет данные в бд на заданные и редиректит на Index.
View
P.s. все следующие файлы имеют название функции, которая за них отвечает и создаются в папке Admin
Для начала создадим представление для самой первой функции - Index
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Admin" asp-action="Create">Новая статья</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Admin" asp-action="Index">Редоктировать</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="row pr-3 pl-3">
@{
foreach (var text in Model.getAllArticles)
{
<div class="col-lg-4">
<h1>@text.Title</h1>
<p style="max-height: 200px; overflow: hidden; text-overflow: ellipsis;">@text.Text</p>
<h5>@text.Time</h5>
<a asp-action="Delete" asp-controller="Admin" asp-route-id="@text.Id">Удалить</a>
<a asp-action="Edit" asp-controller="Admin" asp-route-id="@text.Id">Редактировать</a>
</div>
}
}
</div>ВНИМАНИЕ первый nav нужно добавить в файл Create, так как это меню навигации в админ панели.
Ну а div опять же идентичен блоку кода из Index Home.
Теперь перейдем к удалению статей
@model Lessontg.Models.Article
@{
ViewBag.Title = "Удаление пользователя";
}
<div>
<dl class="dl-horizontal">
<dt>Заголовое</dt>
<dd>
@Html.DisplayFor(model => model.Title)
</dd>
<dt>Текст</dt>
<dd>
@Html.DisplayFor(model => model.Text)
</dd>
<dt>Дата</dt>
<dd>
@Html.DisplayFor(model => model.Time)
</dd>
</dl>
<div>
<form asp-controller="Admin" asp-action="Delete" method="post">
<div class="form-group">
<input type="submit" class="btn btn-default" value="Удалить" style="border: solid 1px #ced4da;" />
</div>
</form>
</div>
</div>
Здесь просто выводим модель, которая выбрана по id.
Ну и редактирование:
@model Lessontg.Models.Article
@{
ViewBag.Title = "Редактирование статьи";
}
<form asp-action="Edit" asp-controller="Admin" asp-route-id="@Model.Id">
<div class="form-group">
<label asp-for="Title" class="control-label">Заголовок</label>
<input type="text" asp-for="Title" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Text" class="control-label">Текст</label>
<textarea asp-for="Text" cols="100" rows="10"></textarea>
</div>
<div class="form-group">
<label asp-for="Time" class="control-label">Дата</label>
<input type="date" asp-for="Time" class="form-control" />
</div>
<div class="form-group">
<input type="submit" value="Сохранить" class="btn btn-default" style="border: solid 1px #ced4da;" />
</div>
</form>Код похож по принципу на разметку Create, поэтому здесь я не буду останавливаться.
Теперь можем нажать F5, перейти в Admin/Create и наслаждаемся нашей админ-панелью.
А на сегодня все,
Удачи программисты!