[英]How to delete two entities in one click ASP.NET CORE MVC
我在按鈕中刪除了刪除Ticket Entities
,並添加了另一個實體,稱為討論。 當用戶單擊詳細信息頁面時,它會加載討論。 現在在我實施 Discussion DeleteTicket 方法之前工作正常,但現在我添加了children
並且 Ticket 不能再被刪除了。 我的問題是:我可以一次刪除兩個實體,還是需要先刪除子實體,然后再刪除父實體? 我嘗試用谷歌搜索並嘗試找到一些靈魂,但不幸的是,我發現的任何東西對我都沒有用。
這是我的代碼:
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
}
}
詳細信息.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>
很抱歉沒有添加足夠的源代碼我不想讓這篇文章只有代碼,但如果你需要更多的源代碼,請告訴我我稍后會添加。 如果帖子對您來說不是那么干凈,請檢查DEMO ,我希望它會很清楚。
干杯!
更新
我添加了刪除討論的功能,但它顯示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>
正如@JamieD77
提到的,您需要先刪除孩子,然后再刪除父母。 假設您的子實體是Discussion
並且父實體是Ticket
,您可以這樣做。 (如果您沒有實施級聯刪除。)
[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" });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.