Asp.net mvc 4 为什么删除无法删除记录?
对于删除操作,我有以下操作:Asp.net mvc 4 为什么删除无法删除记录?,asp.net-mvc-4,Asp.net Mvc 4,对于删除操作,我有以下操作: [HttpPost] public ActionResult Delete(int id, EmployeeDeleteViewModel collection) { try { if (ModelState.IsValid) { Employee e = new Employee { EmpId = collection.EmpID,
[HttpPost]
public ActionResult Delete(int id, EmployeeDeleteViewModel collection)
{
try
{
if (ModelState.IsValid)
{
Employee e = new Employee
{
EmpId = collection.EmpID,
FirstName = collection.FirstName,
LastName = collection.LastName,
DepartmentId = collection.DepartmentID
};
db.Employees.Remove(e);
db.SaveChanges();
return RedirectToAction("Index", new { id = id });
}
// TODO: Add update logic here
return View(collection);
}
catch
{
return View();
}
}
删除视图是:
@model VirtualCampus2.Models.EmployeeDeleteViewModel
@{
ViewBag.Title = "Delete";
}
<h2>Delete</h2>
<h3>Are you sure you want to delete this?</h3>
<fieldset>
<legend>EmployeeDeleteViewModel</legend>
<div class="display-label">
@Html.DisplayNameFor(model => model.EmpID)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.EmpID)
</div>
<div class="display-label">
@Html.DisplayNameFor(model => model.FirstName)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.FirstName)
</div>
<div class="display-label">
@Html.DisplayNameFor(model => model.LastName)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.LastName)
</div>
<div class="display-label">
@Html.DisplayNameFor(model => model.DepartmentName)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.DepartmentName)
</div>
<div class="display-label">
@Html.DisplayNameFor(model => model.DepartmentID)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.DepartmentID)
</div>
</fieldset>
@using (Html.BeginForm())
{
<p>
<input type="submit" value="Delete" /> |
@Html.ActionLink("Back to List", "Index")
</p>
}
操作删除方法:
[HttpGet]//this works fine, gets the record to show on view
public ActionResult Delete(int id)
{
var empList = db.Employees.ToList();
var employee = empList.Where(e => e.EmpId == id).Select(e => new EmployeeDeleteViewModel
{
EmpID=e.EmpId,
FirstName= e.FirstName,
LastName=e.LastName,
DepartmentID=e.DepartmentId,
DepartmentName=e.Department.Name
}).FirstOrDefault();
return View(employee);
}
[HttpPost] //BUT THIS DOES NOT WORK!, evm EmpID does not contain id value
public ActionResult Delete(EmpDeleteCommitViewModel evm)
{
try
{
var employee = db.Employees.Where(e => e.EmpId == evm.EmpID).FirstOrDefault();
db.Employees.Remove(employee);
db.SaveChanges();
return RedirectToAction("Index", new { id = evm.EmpID });
}
catch
{
return View();
}
}
在表单标记之间没有表单控件(
),因此在提交表单时没有可发回的内容。您所做的只是生成一些文本来显示属性值
方法中不需要包含
EmployeeDeleteViewModel集合
参数。您的int id
参数将与员工的id
绑定,假设您使用正确的路由,因此,您只需根据id
从数据库中获取原始数据模型,然后将其删除。模型状态检查无需,因为我没有发送模型?无需检查-您没有发回模型(您当前唯一发回的是id
的值)。只需删除if(ModelState.IsValid)
,因为如果您的模型包含任何验证属性,它将始终失败。如果我没记错的话,如果一个是httpGet,另一个是httpPost,我可以有两个具有相同签名的操作?原因二,我需要在删除之前在页面上显示删除记录您没有显示GET方法,但是如果它具有相同的签名,那么您可以始终创建一个public类DeleteVM{public int ID{GET;set;}
视图模型,然后删除方法是public ActionResult delete(DeleteVM模型){…}
model.ID的值将包含员工的ID。或者,您可以将方法更改为(比如)public ActionResult ConfirmDelete(int ID)
,然后在BeginForm()助手中指定操作方法名称
[HttpGet]//this works fine, gets the record to show on view
public ActionResult Delete(int id)
{
var empList = db.Employees.ToList();
var employee = empList.Where(e => e.EmpId == id).Select(e => new EmployeeDeleteViewModel
{
EmpID=e.EmpId,
FirstName= e.FirstName,
LastName=e.LastName,
DepartmentID=e.DepartmentId,
DepartmentName=e.Department.Name
}).FirstOrDefault();
return View(employee);
}
[HttpPost] //BUT THIS DOES NOT WORK!, evm EmpID does not contain id value
public ActionResult Delete(EmpDeleteCommitViewModel evm)
{
try
{
var employee = db.Employees.Where(e => e.EmpId == evm.EmpID).FirstOrDefault();
db.Employees.Remove(employee);
db.SaveChanges();
return RedirectToAction("Index", new { id = evm.EmpID });
}
catch
{
return View();
}
}