2016-05-11 3 views
0

Ich habe eine generierte Ansicht mit einer Liste von "zu tun, Elemente" Ich versuche, die Delete-Methode für den generierten Link zu löschen. Ich habe einen ListController erstellt, der bereits das Hinzufügen zur Listendatenbank behandelt. Jetzt versuche ich die Liste zu löschen. hier ist mein ListController:Die Delete-Methode funktioniert nicht. Ich habe versucht, zu debuggen und es scheint nicht sogar zu der Methode

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyBasicListApp2.Models.DB; 
using MyBasicListApp2.Models.EntityManager; 
using System.Data.Entity; 

namespace MyBasicListApp2.Controllers 
{ 
    public class ListController : Controller 
    { 
     // GET: List 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     // First I create a todolist action that is used to receive the default ToDoList page 
     // Second I create a post todolist action for submitting form info on the page. 
     // In the method I check to see if the filled out viewmodel contains valid model data state 
     // If data is valid then I create a EntityManager object (contains logic method) so I can use 
     // the addtolist method I made in the ListManager (EntityManager). 
     // Next I will authenticate the form and seth an auth cookie for incase the current session does 
     // not include cookies. 

     public ActionResult ToDoList() 
     { 
      return View(); 
     } 


     // In the post I pass in the viewmodel that the view will use to collect information 
     [HttpPost] 
     public ActionResult ToDoList(tblBasicList LVM) 
     { 
      if (ModelState.IsValid) 
      { 
       ListManager LM = new ListManager(); 
       // Addtolist is a method belonging to ListManager and can only be called if ListManager 
       // object is created in the current context. 
       LM.AddToList(LVM); 
       return RedirectToAction("MyToDoList", "Home"); 

      } 
      return View(); 
     } 

     // Delete method 
     // First create the actionresult for the edit call 
     // Get method 
     public ActionResult Delete() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Delete(int BasicListID) 
     { 
      using (MyBasicListAppEntities db = new MyBasicListAppEntities()) 
      { 
       ListManager LM = new ListManager(); 
       LM.Remove(BasicListID); 
       return RedirectToAction("MyToDoList", "Home"); 
      } 
     } 

    } 
} 

Ich habe eine eigene Klasse mein Entity Framework Methoden für Add Handhabung und löschen:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using MyBasicListApp2.Models.DB; 

namespace MyBasicListApp2.Models.EntityManager 
{ 
    public class ListManager 
    { 
     public void AddToList(tblBasicList LVM) 
     { 
      using (MyBasicListAppEntities db = new MyBasicListAppEntities()) 
      { 
       tblBasicList TBL = new tblBasicList(); 
       TBL.InputDate = LVM.InputDate; 
       TBL.InputItem = LVM.InputItem; 
       TBL.InputImportance = LVM.InputImportance; 
       TBL.ItemCompletion = LVM.ItemCompletion; 

       db.tblBasicLists.Add(TBL); 
       db.SaveChanges(); 
      } 
     }  
     public void Remove(int id) 
     { 
      MyBasicListAppEntities db = new MyBasicListAppEntities(); 

      tblBasicList objDelete = db.tblBasicLists.Find(id); 
      db.tblBasicLists.Remove(objDelete); 
      db.SaveChanges(); 
     } 
    } 
} 

ich von der "MyToDoList.cshtml" Ansicht starten:

@model IEnumerable<MyBasicListApp2.Models.DB.tblBasicList> 

@{ 
    ViewBag.Title = "MyToDoList"; 
} 

<h2>MyToDoList</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.InputDate) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.InputItem) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.InputImportance) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.ItemCompletion) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.InputDate) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.InputItem) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.InputImportance) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.ItemCompletion) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.BasicListID }) | 
      @Html.ActionLink("Details", "Details", new { id=item.BasicListID }) | 
      @Html.ActionLink("Delete", "Delete", "List", new { id=item.BasicListID }) 
     </td> 
    </tr> 
} 

</table> 

Von hier aus wähle ich eines der Elemente aus der Liste (ich habe etwa 6 drin. Die Add-Methode funktioniert perfekt). Aber wenn ich auf die Schaltfläche Löschen klicke, erhalte ich den Fehler "Ressource nicht gefunden". Es wird nicht einmal auf die Delete-Ansicht umgeleitet, was mir schwer fällt herauszufinden, warum. Ziel ist es, auf die Löschseite zu verweisen, für das ausgewählte Element auf Löschen zu klicken und dann zur Seite "MyToDoList" zurückgeleitet zu werden. Irgendwelche Ideen?

+0

Ok also eine neue Überladung zum Aktionslink hinzufügen: @ Html.ActionLink ("Löschen", "Löschen", "Liste", neu {id = item.BasicListID}, neu {}) Es leitet jetzt zum Löschen Aussicht. Aber damit werden keine Daten übertragen. und wenn ich delete hole, bekomme ich ein Das Parameterwörterbuch enthält einen Nulleintrag für den Parameter 'BasicListID' des Typs 'System.Int32', der keinen Nullwert hat. – Devon

Antwort

1

Für eine kurze Antwort, die Delete-Methode ändern (HTTP GET) zu

public ActionResult Delete(int id) 
{ 
    tblBasicList todoItem = FindTodoItem(id); //with whatever method to get that todo item 
    return View(todoItem); 
} 

Ich glaube, Sie versuchen, eine Webanwendung mit ASP.NET MVC zu erstellen. Es gibt einige Namenskonventionen für Controller/Ansicht/Modell. Ich würde empfehlen, einige Tutorials für Ihre Referenz in diesem Link http://www.asp.net/mvc/overview/getting-started/introduction/getting-started

+0

Das ist im Wesentlichen, was ich tun musste. Also habe ich im Grunde eine Methode zum Löschen und Löschen erstellt. Als ich den Löschen-Knopf drückte, rief er die Löschaktion, aber nicht den Post an. Ich löschte den Beitrag und änderte die Art von dem, was Sie gesagt haben: public ActionResult Delete (int id) { ListManager LM = new ListManager(); LM.Remove (id); Und dann habe ich die Remove-Methode (siehe oben) aus meiner listManager-Klasse aufgerufen. Jetzt löscht es sie nur aus der Liste in der Ansicht. Ich muss herausfinden, wie man die Bestätigungsseite löscht. – Devon

+1

@Devon Ich denke, das Löschverfahren, das Sie erwähnt haben, ist korrekt. Sie müssen die Delete-Methode für HTTP POST nicht löschen. Der Grund, warum ich einen Parameter 'id' für die Delete-Methode für HTTP GET hinzugefügt habe, ist, dass sie von der standardmäßigen ASP.NET MVC-Routing-Regel benötigt wird. Wie ich schon sagte gibt es einige Namenskonvention Regeln in asp.net mvc. Wenn Sie den Controller und die Ansichten mit Scaffold-Vorlage (mit Entity Framework für CRUD) in Visual Studio erstellen, erstellt VS den gesamten Code für Sie. Deshalb schlage ich vor, einen Blick auf das asp.net mvc Tutorial zu werfen. Viel Glück. – yyou

0

Sie benötigen keine Get und ein [HttpPost] für einen Controller wie Löschen, da es keine tatsächliche Ansicht dafür gibt.

public ActionResult Delete(int BasicListID) 
    { 
     MyBasicListAppEntities db = new MyBasicListAppEntities(); 
     tblBasicList objDelete = db.tblBasicLists.Find(id); 
     db.tblBasicLists.Remove(objDelete);//this can actually be simplified 
     return RedirectToAction("Home"); 
    } 

Sie müssen es nur an den Controller wie zu Hause umleiten, ohne die Liste, um es vorbei, wird die Heimsteuerung kümmert sich um die Liste zu übergeben.

+1

Nein, das hat nicht funktioniert. Zuerst bekam ich einen mehrdeutigen Fehler, also änderte ich den Parameter in int? BasicListId, dann habe ich eine Notwendigkeit getestet zu werden, wenn null Fehler, also warf ich es in einen Versuch catch: try {if (BasicListID! = Null) {remove object} catch (neue Fehler Ausnahme (e.ToString()) werfen;} Jetzt ist dies nur eine Ressource kann nicht gefunden werden Fehler.Aber ich bin jetzt weiter und schätze die Hilfe! – Devon

+0

Wenn ich also mit dem Debugger durchgehe, wenn ich zum Versuch komme, fängt der Wert immer als Null an – Devon

Verwandte Themen