[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
У цьому уроці розглянемо приклад, як виконати видалення користувача з таблиці за допомогою JavaScript.
Щоб створити проект UsersCrud, запустіть Visual Studio і виберіть у меню File (Файл) – New Project (Створити Проект). Вкажіть шаблон проекту ASP.NET Core Web Application (Веб-додаток ASP.NET Core). Введіть UsersCrud, у полі Name, на наступній сторінці вкажіть Framework .Net 7.0 і натисніть кнопку Create:
Модель і Репозиторій
Модель для додатка UsersCrud буде заснована на списку користувачів. Створіть папку Models і додайте в неї файл класу на ім’я User.cs з таким вмістом:
1 2 3 4 5 6 7 |
public class User { public int Id { get; set; } public string Name { get; set; } public string Phone { get; set; } public DateTime BirthDate { get; set; } } |
Мені подобається забезпечувати узгоджений доступ до даних у застосунку з використанням патерну “Сховище” (Repository), у якому інтерфейс визначає властивості та методи, призначені для доступу до даних, а для роботи з механізмом зберігання даних застосовується клас реалізації. Перевага використання патерну “Сховище” пов’язана з полегшенням модульного тестування частини MVC додатка, а також із тим, що деталі, які стосуються зберігання даних, приховані від інших частин додатка.
Щоб створити інтерфейс сховища, створіть папку Interfaces і додайте в неї файл інтерфейсу на ім’я IUser.cs з таким вмістом:
1 2 3 4 5 6 |
public interface IUser { IEnumerable<User> GetAllUsers(); User GetUser(int userId); void RemoveUser(User user); } |
Створіть папку Repository і додайте в неї файл класу на ім’я UserRepository.cs з таким вмістом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public class UserRepository : IUser { private List<User> users; public UserRepository() { users = new List<User>(20); string[] names = { "John", "Mary", "David", "Emma", "James", "Linda", "Michael", "Sarah", "Kevin", "Laura", "Richard", "Susan", "Christopher", "Nancy", "Daniel", "Karen", "Brian", "Lisa", "Matthew", "Angela" }; for (int i = 0; i < 10; i++) { users.Add(new User { Id = i + 1, Name = names[i % names.Length] + " " + (i + 1), Phone = $"+38 (097) 0{i}4-{i}3-6{i}", BirthDate = DateTime.Now.AddYears(-20 - i) }); } } public IEnumerable<User> GetAllUsers() { return users; } public User GetUser(int userId) { return users.FirstOrDefault(e => e.Id == userId)!; } public void RemoveUser(User user) { users.Remove(user); } } |
У цьому проекті ми збираємося зберігати об’єкти моделі в пам’яті, але вам не важко буде переробити його під інше сховище.
Додамо в клас Program оператор наступний оператор, щоб зареєструвати клас UserRepository як реалізацію для використання в якості залежностей інтерфейсу IUser:
1 |
builder.Services.AddSingleton<IUser, UserRepository>(); |
Цей рядок коду реєструє клас UserRepository із застосуванням методу AddSingleton. У результаті під час розпізнавання залежності інтерфейсу IUser вперше створюється одиночний об’єкт, який буде використовуватися для всіх наступних залежностей.
Контролер і Подання
Основний акцент у цьому прикладі додатка зроблено на керуванні об’єктами користувачів, а саме: відображення у вигляді таблиці, можливість додавання і видалення.
Нам потрібен контролер, який отримуватиме НТТР-запити і транслюватиме їх в операції над об’єктами User, тож створимо папку Controllers, додамо до неї файл на ім’я HomeController.cs, з таким вмістом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class HomeController : Controller { private readonly IUser _users; public HomeController(IUser users) { _users = users; } [Route("/")] [HttpGet] public IActionResult Index() { return View(_users.GetAllUsers()); } [Route("/delete-user")] [HttpDelete] public IActionResult DeleteUser(int userId) { var currentUser = _users.GetUser(userId); if (currentUser is not null) { _users.RemoveUser(currentUser); return Ok(); } else { return NotFound(); } } } |
У папку Views / Home додамо подання Index.cshtml, з таким вмістом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
@{ ViewData["Title"] = "All Users"; } @model IEnumerable<User> <div class="row g-4 py-5 row-cols-1"> <div class="p-5 mb-4 bg-light rounded-3 ovx table-responsive"> <table class="table"> <tr><th>Name</th><th>Phone</th><th>BirthDate</th><th></th></tr> @foreach (var user in Model) { @*Обязательно прописываем данный атрибут С помощью него мы удалим данную строку, используя JavaScript*@ <tr data-rowid="@user.Id"> <td>@user.Name</td> <td>@user.Phone</td> <td>@user.BirthDate.ToShortDateString()</td> <td> @*Обязательно прописываем onClick и метод, который будет обрабатывать клик*@ <button onclick="deleteUser('@user.Id')" class="btn btn-sm btn-danger">Remove</button> </td> </tr> } </table> @await Html.PartialAsync("_Modal", "Delete the selected user?") <script> async function deleteUser(userId) { const btnYes = document.getElementById('btn-Yes'); const btnNo = document.getElementById('btn-No'); console.log(btnYes); $('#confirmModal').modal('show'); //Если нажали да, удаляем btnYes.onclick = () => { const deleteItem = fetch(`/delete-user/?userId=${userId}`, { method: 'DELETE' }) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } //Удаляем строку document.querySelector("tr[data-rowid='" + userId + "']").remove(); //Закрываем модальное окно $('#confirmModal').modal('hide'); }) .catch(error => { console.error('There was a problem with the fetch operation:', error); // Обработка ошибки удаления }); } //Если нажали нет, скрываем btnNo.onclick = () => { $('#confirmModal').modal('hide'); } } </script> </div> </div> |
У папку Views / Shared додамо часткове подання _Modal.cshtml, з таким вмістом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@model string <div class="modal" id="confirmModal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Confirm action</h5> </div> <div class="modal-body"> <p>@Model</p> </div> <div class="modal-footer"> @*Обязательно прописываем ID*@ <button id="btn-Yes" class="btn btn-secondary">Delete</button> <button id="btn-No" class="btn btn-secondary" data-dismiss="modal">Cancel</button> </div> </div> </div> </div> |
За допомогою цього часткового подання, ми зможемо підключати і відображати модальне вікно в різних частинах програми. Запустіть додаток і перевірте його роботу:
Я сподіваюся, що вам сподобалося читати цю статтю, і вона виявилася легкою для розуміння. Будь ласка, дайте мені знати, якщо у вас є якісь коментарі або виправлення.
Так само вам може бути цікава попередня стаття – Що таке майстер сторінка в Asp.net.
Ви хочете навчитися писати код мовою програмування C#?
Створювати різні інформаційні системи, що складаються з сайтів, мобільних клієнтів, десктопних додатків, телеграм-ботів тощо.
Переходьте до нас на сторінку Dijix і ознайомтеся з умовами навчання, ми спеціалізуємося тільки на індивідуальних заняттях, як для початківців, так і для просунутих програмістів. Ви можете взяти як одне заняття для опрацювання питання, що вас цікавить, так і кілька, для більш щільної роботи. Завдяки особистому кабінету, кожен студент підвищить якість свого навчання, у вашому розпорядженні:
- Доступ до пройденого матеріалу
- Тематичні статті
- Бібліотека книг
- Онлайн тестування
- Спілкування в закритих групах