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.
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.