2015-04-07 66 views
0

失败,我试图删除索引视图页面实体这样删除操作在MVC

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

单击此按钮我希望我的DeleteConfirmed行动中控制器发生(不转到其他删除页)。

内部控制器

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

现在它引发错误

参数字典包含 非空类型的参数的“id”“System.Int32”的方法的空条目 'DeviceApp.Controllers.IssueController'中的'System.Web.Mvc.ActionResult DeleteConfirmed(Int32)' 'DiagnosisApp.Controllers.IssueController'。可选参数 必须是参考类型,可为空类型,或者声明为可选 参数。

参数名:参数

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

+0

发表您的删除动作代码也。 –

+0

@Kartikeya新增 – Athul

+1

与问题无关,但好的做法是不要使用硬编码的网址,而是使用@Url助手。 –

回答

1

从错误

参数字典包含参数“ID”

告诉我们,你有没有实际传递什么控制器空项。使用您的视图中模型的数据

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

:所以,“通行证”价值,你的控制器ID,您可以使用一个类似于ActionLink


此'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不为空。但是,可能需要进一步的验证来测试ID是否在db中实际找到。

它首先测试您是否发送了一个id值,如果是,则完成数据库中的'delete'操作。

注意

使用MVC的脚手架时

+0

我不想去删除确认页面,这是这里的主要问题 – Athul

+0

@Athul:最后的代码片段告诉你如何跳过! – jbutler483

+0

OP的问题在于发布ID。使ID可选不会解决问题。 – CodeCaster

-1

你的行为表明删除需要一个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> 
} 
+0

所有这些都引导我到另一个页面按钮点击(删除页面) – Athul

+0

@Athul他的回答是正确的,除了他需要指定表单方法POST。 –

0

尝试下面的代码,这些行动都是免费的。在您确认之前,它不会将您重定向到删除页面。

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

OP不想拥有'你确定吗?'页面来显示。 – jbutler483

2

您没有在您的POST中提供该ID,也没有提供您的URL。

无论是POST到包含ID的网址:

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

或交的ID作为隐藏的表单值:

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

你认为这个id是在模型中......我们都知道这个假设是所有f * ckups的母亲。 –

+0

@Paul当然,但是OP是_“试图从索引视图页面删除一个实体”,所以在打印这个表单时他处于某种循环中。然后,OP可以用'm => m.AllModels [i] .ID'(或通过使用DisplayTemplates,省略循环的需要)用'currentModel.ID'或'm => m.ID'替换'Model.ID' )。是的,假设在一个实体中存在一个ID,其余的代码指向为真('DeleteConfirmed(int id)','_db.Issues.Find(id)')。 – CodeCaster