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();
            }
        }