我正试图从像这样的索引视图页面中删除一个实体
@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 ;.必须有一个可选参数 是引用类型,可空类型,或声明为可选 参数。
参数名称:参数
任何人都可以指出实现这一目标的正确方法是什么?
答案 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>
}