删除操作在MVC中失败

时间:2015-04-07 10:27:02

标签: c# asp.net-mvc

我正试图从像这样的索引视图页面中删除一个实体

@using (Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <button type="submit" value="delete" formaction="/Issue/Delete">Delete</button>
}

在此按钮上单击我希望控制器内部的DeleteConfirmed Action发生(不要转到另一个删除页面)。

内部控制器

  [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
        Issue issue = _db.Issues.Find(id);
        _db.Issues.Remove(issue);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

现在它会抛出错误

  

参数字典包含参数&#39; id&#39;的空条目。的   非可空类型&System; Int32&#39;方法   &#39; System.Web.Mvc.ActionResult DeleteConfirmed(Int32)&#39;在   &#39; DiagnosisApp.Controllers.IssueController&#39 ;.必须有一个可选参数   是引用类型,可空类型,或声明为可选   参数。

     

参数名称:参数

任何人都可以指出实现这一目标的正确方法是什么?

4 个答案:

答案 0 :(得分:2)

您未在POST或网址中提供ID。

POST到包含ID的URL:

@using (Html.BeginForm("Delete", "Controller", new { id = Model.ID }, FormMethod.Post))
{
    // ...
}

或者将ID作为隐藏的表单值发布:

@using (Html.BeginForm("Delete", "Controller", FormMethod.Post))
{
    @Html.HiddenFor(m => m.ID)
    // ...
}

答案 1 :(得分:1)

从错误

  

参数字典包含参数&#39; id&#39;

的空条目

告诉我们您实际上没有向控制器传递任何内容。所以,要通过&#39;对于您的控制器的id值,您可以使用类似于:{/ p>的ActionLink

@Html.ActionLink("Delete", "Delete", new { id=item.PrimaryKeyValue })

在您的视图中使用您的模型数据。


这个&#39; ActionLink&#39;将在您的控制器中链接到您的CRUD脚手架(我相信您已经在使用它);

这样的事情:

 // GET: message/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            message message = db.messages.Find(id);
            if (message == null)
            {
                return HttpNotFound();
            }
            return View(message);
        }

会自动带您进入“删除确认页面”。但是,您可能希望将其更改为:

        // POST: message/Delete/5
        public ActionResult Delete(int? id)
        {
            if(id !=null){
               message message = db.messages.Find(id);
               db.messages.Remove(message);
               db.SaveChanges();
               return RedirectToAction("Index");
            }
            else
            {
               return HttpNotFound();
            }
        }

此方法跳过&#39;删除确认页面,同时仍然保持验证,如果id不是null。但是,可能需要进一步验证以测试是否实际在db中找到了id。

首先测试您是否发送了ID值,如果是,则完成“删除”#39;数据库中的操作。

注意

使用MVC脚手架时可以免费使用这些操作

答案 2 :(得分:0)

尝试以下代码。在您确认之前,它不会将您重定向到删除页面。

@Html.ActionLink("About", "delete", "Issue", new { id = "yourId" }, new { onclick = "return confirm('Are you sure you wish to delete this article?');" })

答案 3 :(得分:-1)

您的操作说明删除需要ID,但您在提交表单时未从视图中传递该ID。

尝试更改您的代码。 不要忘记使用ID更改隐藏值。

@using (Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input type="hidden" name="id" id="id" value="<THE VALUE>"/>        
     <button type="submit" value="delete" formaction="/Issue  /Delete">Delete</button>
}