Как реализовать редактирование данных в таблице БД через веб-интерфейс asp.net core mvc
Работаю над проектом asp.net, где необходимо реализовать работу клиента с базой данных. Необходимо добавить функции добавления, удаления и редактирования записей в таблицах. Задача простая, но наткнулся на такую вот структуру в базе данных:
Как я уже выяснил, решение ввести вспомогательные таблицы Managers и CPEs было принято для избежания связей многие ко многим. Только вот вопрос: как реализовать редактирование таблицы Enterprises через пользовательский интерфейс. На asp.net работаю недавно, не сталкивался с такими случаями. Для редактирования других таблиц делал ссылку на вспомогательную страницу с формой, где получал данные от пользователя, выполнял необходимый запрос и перенаправлял на главную страницу. Вот пример того, как я делал это с остальными таблицами: Есть таблица планируемых мероприятий, которая связана с таблицей предприятий, сотрудников, мероприятий и источников финансирования(см. рисунок)
Было создано отдельное представление для добавления записи:
@model PlannedEvent
@{
ViewData["Title"] = "Добавление планируемого мероприятия";
}
<h2>Добавление планируемого мероприятия</h2>
@using(Html.BeginForm())
{
<h4>Планируемое мероприятие</h4>
<p>
Планируемое мероприятие <br>
@Html.DropDownListFor(model => model.EventId, ViewBag.Events as SelectList)
</p>
<p>
Предприятие <br>
@Html.DropDownListFor(model => model.EnterpriseId, ViewBag.Enterprises as SelectList)
</p>
<p>
Начало мероприятия <br>
@Html.EditorFor(model => model.DateOfStart)
</p>
<p>
Конец мероприятия <br>
@Html.EditorFor(model => model.DateOfEnd)
</p>
<p>
Объём <br>
@Html.EditorFor(model => model.Scope)
</p>
<p>
Затраты <br>
@Html.EditorFor(model => model.Expenses)
</p>
<p>
Экономический эффект <br>
@Html.EditorFor(model => model.EconomicEffect)
</p>
<p>
Ответственный за проведение мероприятия <br>
@Html.DropDownListFor(model => model.EmployeeId, ViewBag.Employees as SelectList)
</p>
<p>
Номер финансирования <br>
@Html.DropDownListFor(model => model.FinanceId, ViewBag.SourcesOfFinancing as SelectList)
</p>
<p>
<input type="submit" value="Запланировать мероприятие">
</p>
}
Ну а для реализации в контроллере написан следующий код:
[HttpGet]
public ActionResult Create()
{
SelectList events = new(_context.Events, "Id", "Name");
SelectList enterprises = new(_context.Enterprises, "Id", "Name");
SelectList employees = new(_context.Employees, "Id", "Surname");
SelectList financings = new(_context.SourcesOfFinancing, "Id", "Id");
ViewBag.Events = events;
ViewBag.Enterprises = enterprises;
ViewBag.Employees = employees;
ViewBag.SourcesOfFinancing = financings;
return View();
}
[HttpPost]
public ActionResult Create(PlannedEvent plannedEvent)
{
_context.PlannedEvents.Add(plannedEvent);
_context.SaveChanges();
return RedirectToAction("Index");
}
По итогу получается такой интерфейс:
Как в такой же форме реализовать добавление, удаление и редактирование записей в таблице Enterprises? Ведь там уже целых 2 связи, а не 1, в случае, когда нам придётся выбирать менеджера и гл. энергетика предприятия.
Ответы (1 шт):
Сначала создадим представление с формой для добавления записи
@model Enterprise
@{
ViewData["Title"] = "Добавление предприятия";
}
<h2>Добавление предриятия</h2>
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="OwnershipForm" class="control-label"></label>
<input asp-for="OwnershipForm" class="form-control" />
<span asp-validation-for="OwnershipForm" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Adress" class="control-label"></label>
<input asp-for="Adress" class="form-control" />
<span asp-validation-for="Adress" class="text-danger"></span>
</div>
<!-- Добавление выпадающего списка для выбора менеджера -->
<div class="form-group">
<label asp-for="ManagerId" class="control-label"></label>
<select asp-for="ManagerId" class="form-control" asp-items="@ViewBag.Managers"></select>
<span asp-validation-for="ManagerId" class="text-danger"></span>
</div>
<!-- Добавление выпадающего списка для выбора главного энергетика -->
<div class="form-group">
<label asp-for="CPEId" class="control-label"></label>
<select asp-for="CPEId" class="form-control" asp-items="@ViewBag.CPEs"></select>
<span asp-validation-for="CPEId" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
Теперь добавим методы в контроллер
public IActionResult Create()
{
// Заполнение выпадающих списков данными из таблицы Employees
ViewBag.Managers = new SelectList(_context.Employees, "Id", "Surname");
ViewBag.CPEs = new SelectList(_context.Employees, "Id", "Surname");
return View();
}
[HttpPost]
public async Task<IActionResult> Create([Bind("Id,Name,OwnershipForm,Adress,ManagerId,CPEId")] Enterprise enterprise)
{
// Добавление записи в таблицу Enterprises
_context.Add(enterprise);
// Сохранение изменений в базе данных
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Аналогичным образом делается редактирование записей. В представление необходимо добавить скрытое поле для идентификатора.


