C# 删除操作在MVC中失败

C# 删除操作在MVC中失败,c#,asp.net-mvc,C#,Asp.net Mvc,我正试图像这样从索引视图页面中删除一个实体 @using (Html.BeginForm()) { @Html.AntiForgeryToken() <button type="submit" value="delete" formaction="/Issue/Delete">Delete</button> } 现在它抛出了一个错误 参数字典包含的参数“id”为空 方法的不可为Null的类型“System.Int32” 中的“System.Web.M

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

@using (Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <button type="submit" value="delete" formaction="/Issue/Delete">Delete</button>
}
现在它抛出了一个错误

参数字典包含的参数“id”为空 方法的不可为Null的类型“System.Int32” 中的“System.Web.Mvc.ActionResult deleteConfirmmed(Int32)” “DiagnosisAP.Controllers.IssueController”。必须提供可选参数 可以是引用类型、可为null的类型,也可以声明为可选类型 参数

参数名称:参数


有人能指出实现这一点的正确方法吗?

您的操作说明删除操作需要一个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>
}
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
删除
}
来自错误

参数字典包含参数“id”的空条目

告诉我们您实际上没有向控制器传递任何内容。因此,要将id值“传递”给控制器,可以使用类似于以下内容的
ActionLink

@Html.ActionLink("Delete", "Delete", new { id=item.PrimaryKeyValue })
在视图中使用模型的数据


这个“ActionLink”将链接到控制器中的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();
            }
        }
此方法“跳过”删除确认页面,同时在id不为null的情况下,在测试期间仍保持验证。但是,如果在数据库中实际找到id,则可能需要进一步验证

首先测试是否已发送id值,如果已发送,则在数据库中完成“删除”操作

注意


当使用MVC的脚手架时,这些操作是免费的

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

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

您没有在帖子或URL中提供ID

发布到包含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)
    // ...
}

同时发布您的删除操作代码。与问题无关,但作为良好实践,不要使用硬编码Url,而是使用@Url helpers。您需要将Id传递给您的操作方法。@JenishRabadiya如何?您可以添加代码示例吗?id来自哪里?网格?用户输入?视图模型?显示一些代码plz。所有这些都将我带到另一个页面,点击按钮(删除页面)@Athul他的答案是正确的,只是他需要指定表单方法POST。我不想进入删除确认页面,这是主要问题here@Athul:最后一个代码片段向您展示了如何跳过它!OP的问题在于发布ID。将ID设置为可选并不能解决问题。@CodeCaster:这就是为什么在文章的开头,我发送了一个;P@jbutler这是一个链接,不是一个表单帖子OP根本不想显示“确定吗?”页面。您假设id在模型中。。。我们都知道,假设是所有f*备份之母。@Paul,当然,但OP“试图从索引视图页面删除一个实体”,所以在打印此表单时,他处于某种循环中。然后OP可以将
Model.ID
替换为
currentModel.ID
,或者将
m=>m.ID
替换为
m.AllModels[i].ID
(或者使用DisplayTemplates,省去循环的需要)。是的,这假设一个实体中存在一个ID,其余的代码都指向该ID为true(
deleteComfixed(int-ID)
\u db.Issues.Find(ID)
)。
@using (Html.BeginForm("Delete", "Controller", FormMethod.Post))
{
    @Html.HiddenFor(m => m.ID)
    // ...
}