2015-04-07 84 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