简体   繁体   中英

How to delete two entities in one click ASP.NET CORE MVC

I have in button delete which delete Ticket Entities and I add another entities call Discussion. When user click on Details page it is load Discussion. Now before I implement Discussion DeleteTicket method works fine, but now I add children and Ticket couldn't be deleted anymore. My question is: Can I delete two entities at one time, or I need to delete first children entities and then parent? I try to google and try to find some soultion but unfortunettly anything which I find is not usefull for me.

DEMO

Here is my code:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Linq;
using System.Security.Claims;
using VmSTicketing.DataAccess.Data;
using VmSTicketing.DataAccess.Repository.IRepository;
using VmSTicketing.Models;
using VmSTicketing.Models.Enum;
using VmSTicketing.Models.ViewModels;
using VmSTicketing.Utility;

namespace VmSTicketing.Areas.Manager.Controllers
{
    [Area("Manager")]
    [Authorize(Roles = SD.Role_Admin + "," + SD.Role_Manager)]
    public class TicketController : Controller
    {
        private readonly IUnitOfWork _unitOfwork;
        private readonly ApplicationDbContext _db;


        public TicketController(IUnitOfWork unitOfwork, ApplicationDbContext db)
        {
            _unitOfwork = unitOfwork;
            _db = db;
        }

        public IActionResult Index()
        {
            return View();
        }



        public IActionResult Upsert(int? Id)
        {
            TicketVM ticketVM = new TicketVM()
            {
                Ticket = new Ticket(),
                TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
                {
                    Text = i.Name,
                    Value = i.Id.ToString()
                }),
                ApplicationUser = new ApplicationUser(),
                Client = new Client()
            };


            if (Id == null)
            {
                return View(ticketVM);
            }

            ticketVM.Ticket = _unitOfwork.Ticket.Get(Id.GetValueOrDefault());

            if (ticketVM.Ticket == null)
            {
                NotFound();
            }
            return View(ticketVM);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Upsert(TicketVM ticketVM)
        {
            var users = _unitOfwork.ApplicationUser.GetAll(x => x.Id == x.UserName);
            var userName = User.FindFirstValue(ClaimTypes.Email);
            var user = HttpContext.User.Identity.Name;

            if (ModelState.IsValid)
            {
                if (ticketVM.Ticket.Id == 0)
                {
                    ticketVM.Ticket.ApplicationUser = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
                    ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
                    _unitOfwork.Ticket.Add(ticketVM.Ticket);
                }
                //else
                //{
                //    ticketVM.Ticket.ApplicationUser = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
                //    ticketVM.Ticket.Status = ((TicketStatus)Convert.ToInt32(ticketVM.Ticket.Status)).ToString();
                //    _unitOfwork.Ticket.Update(ticketVM.Ticket);
                //}
                _unitOfwork.Save();
                return RedirectToAction(nameof(Index));
            }
            return View(ticketVM);
        }

        public IActionResult TicketStatusEdit(int ticketId)
        {
            var ticket = _unitOfwork.Ticket.Get(ticketId);
            ticket.Status = ((TicketStatus)Convert.ToInt32(ticket.Status)).ToString();
            _unitOfwork.Save();
            return View();
        }



        public IActionResult Details(int? Id)
        {
            TicketVM ticketVM = new TicketVM()
            {
                Ticket = _unitOfwork.Ticket.Get(Id.GetValueOrDefault()),
            };

            if (Id == null)
            {
                return NotFound();
            }

            var ticketType = _unitOfwork.Ticket.GetAll(includeProperties: "TicketType,ApplicationUser");
            ViewBag.discussion = _unitOfwork.Discussion.GetAll(d => d.TicketId == Id).OrderBy(d => d.Id).ToList();

            return ticketVM.Ticket != null ? View(ticketVM) : NotFound();
        }


        [HttpPost]
        public IActionResult SendDiscussion(int ticketId,string message)
        {
            
            var userName = User.FindFirstValue(ClaimTypes.Email);
            var account = _db.ApplicationUsers.SingleOrDefault(a => a.UserName.Equals(userName));
            

            var discussion = new Discussion();
            discussion.DateAndTime = DateTime.Now;
            discussion.Content = message;
            discussion.TicketId = ticketId;
            discussion.UserId = account.Id;
            _unitOfwork.Discussion.Add(discussion);
            _unitOfwork.Save();
            return RedirectToAction("Details", new { id = ticketId});
        }


        #region API CALLS    


        [HttpGet]
        public IActionResult GetByName(string name)
        {
            var obj = _unitOfwork.ApplicationUser.GetAll(x => x.Name == name);
            //var obj = _unitOfwork.Ticket.GetAll(x => x.ApplicationUser.Name == name);
            return Json(new { data = obj });
        }

        [HttpGet]
        public IActionResult GetAll()
        {
            var username = User.FindFirst(ClaimTypes.Name).Value;
            var account = _unitOfwork.ApplicationUser.GetFirstOrDefault(a => a.UserName.Equals(username));
            var isAdministrator = User.IsInRole("Admin");
            var obj = _unitOfwork.Ticket.GetAll(filter: x => (isAdministrator || x.UserId == account.FirstOrDefault().Id), includeProperties: "TicketType,ApplicationUser");
            return Json(new { data = obj });
        }


        [HttpDelete]
        [Authorize(Roles = SD.Role_Admin)]
        public IActionResult Delete(int id)
        {
            var objFromDb = _unitOfwork.Ticket.Get(id);
            if (objFromDb == null)
            {
                return Json(new { success = false, message = "Error while deleting" });
            }
            _unitOfwork.Ticket.Remove(objFromDb);
            _unitOfwork.Save();
            return Json(new { success = true, message = "Delete Successfull" });
        }


        #endregion

    }
}

Details.cs

@model VmSTicketing.Models.ViewModels.TicketVM
@using VmSTicketing.Utility
@{
    ViewData["Title"] = "Details";
    Layout = "~/Views/Shared/AdminLTE/_Layout.cshtml";
}

<h2 class="text-info">Pregled tiketa</h2>
<div class="p-4 border rounded">
    <div class="form-group row">
        <div class="col-2">
            <label>Vrsta tiketa</label>
        </div>
        <div class="col-5">
            <input asp-for="Ticket.TicketType.Name" disabled class="form-control" />
        </div>
    </div>
    <div class="form-group row">
        <div class="col-2">
            <label>Opis</label>
        </div>
        <div class="col-5">
            <textarea asp-for="Ticket.Description" disabled class="form-control"></textarea>
        </div>
    </div>


    @if (User.IsInRole(SD.Role_Admin))
    {
        <input type="hidden" asp-for="Ticket.Id" />

        <div class="form-group row">
            <div class="col-2">
                <label>User</label>
            </div>
            <div class="col-5">
                <input asp-for="Ticket.ApplicationUser.Name" disabled class="form-control" />
            </div>
        </div>
        <div class="form-group row">
            <div class="col-2">
                <label>Datum i vrijeme slanja</label>
            </div>
            <div class="col-5">
                <input asp-for="Ticket.DateAndTime" disabled class="form-control" />
            </div>
        </div>
        <div class="form-group row">
            <div class="col-2">
                <label>Status Tiketa</label>
            </div>
            <div class="col-5">
                <select asp-for="@Model.Ticket.Status"  asp-items="Html.GetEnumSelectList<VmSTicketing.Models.Enum.TicketStatus>()" class="form-control"></select>
            </div>
        </div>
    }

    <br />
    <div class="form-group">
        <a asp-action="Index" class="btn btn-success">Back to List</a>
    </div>   
</div>

<hr />


<div class="row">
    <div class="col-md-12">
        <div class="card card-primary direct-chat direct-chat-primary">
            <div class="card-header">
                <h3 class="card-title">Discussion</h3>
            </div>
            <div class="card-body">
                <div class="direct-chat-messages">
                    @if (ViewBag.discussion != null)
                    {
                        @foreach (var discussion in ViewBag.discussion)
                        {
                            <div class="direct-chat-msg @(discussion.ApplicationUser.Role == "Admin" ? "": "right")">
                                <div class="direct-chat-infos clearfix">
                                    <span class="direct-chat-name @(discussion.ApplicationUser.Role == "Admin" ? "float-right": "float-left")">@discussion.ApplicationUser.Name</span>
                                    <span class="direct-chat-timestamp @(discussion.ApplicationUser.Role == "Admin" ? "float-left": "float-right")">@discussion.DateAndTime.ToString("dd/MM/yyyy HH:mm")</span>
                                </div>

                                <div class="direct-chat-text">
                                    @discussion.Content
                                </div>
                            </div>
                        }
                    }

                </div>
            </div>
            <div class="card-footer">
                <form asp-controller="Ticket" asp-action="SendDiscussion" method="post">
                    <div class="input-group">
                        <input type="text" name="message" placeholder="Type Message ..." class="form-control">
                        <span class="input-group-append">
                            <button type="submit" class="btn btn-primary">Send</button>
                        </span>
                    </div>
                    <input type="hidden" name="ticketId" asp-for="Ticket.Id" />
                </form>
            </div>
        </div>
    </div>
</div>

Sorry for not adding enought source code I don't want to make this post only code, but If you need more source please let me know I will add later on. if post is not so clean for you, please check DEMO and I hope it will be clear.

Cheers !

UPDATE

I add funtion to remove Discussion but It show me error message 405

 [HttpDelete]
        public IActionResult DeleteDiscussion(int id)
        {
            var discussion = new Discussion();
            _unitOfwork.Discussion.Remove(discussion);
            _unitOfwork.Save();
            return View(discussion);
        }

<a asp-area="Manager" asp-controller="Ticket" asp-action="DeleteDiscussion" class="btn btn-danger">Delete Discussion</a>

As @JamieD77 mentioned you need to delete child first, then delete the parent. Assuming your child entity is Discussion and parent is Ticket , you can do something like this. (if you don't have cascade delete implemented.)

[HttpDelete]
[Authorize(Roles = SD.Role_Admin)]
public IActionResult Delete(int id)
{
    var objFromDb = _unitOfwork.Ticket.Get(id);
    if (objFromDb == null)
    {
        return Json(new { success = false, message = "Record not found" });
    }

    if (objFromDb.Discussion != null) //if you have Discussion associated with Ticket delete that first.
    {
        try
        {
            _unitOfwork.Discussion.Remove(objFromDb.Discussion);
            _unitOfwork.Save();
        }
        catch(Exception e)
        {
            return Json(new { success = false, message = "Error while deleting" });
        }
    }
    
    try
    {
        _unitOfwork.Ticket.Remove(objFromDb);
        _unitOfwork.Save();
    }
    catch(Exception e)
    {
        return Json(new { success = false, message = "Error while deleting" });
    }
    
    return Json(new { success = true, message = "Delete Successfull" });
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM