2016-05-13 9 views
0

So habe ich eine To-Do-Liste Anwendung, die ich entwickeln (Ich bin ein komplettes noob bei MVC). Ich mache mit der CRUD-Implementierung weiter und habe gerade die Delete- und DeleteConfirmed-Methode geschrieben. Ich bin nicht einmal ganz sicher, wie ich es herausgefunden habe. Etwas verbunden und ich habe es versucht und es hat funktioniert, aber ein Aspekt ist verrückt.Meine Lösung funktioniert, ich verstehe nur nicht ganz, warum: To-Do-Liste Anwendung MVC5

Also habe ich eine Liste von Elementen mit den "Bearbeiten, Details und Löschen" Aktionslinks neben jedem Element (Ansicht wurde generiert). Also beschloss ich, mit dem Löschen zu beginnen. Ich machte die Löschaktion, die ziemlich geradlinig ist. Übergeben Sie eine int-ID aus dem vom Benutzer ausgefüllten Formular, überprüfen Sie, ob es null ist, erstellen Sie das Tabellenklassenobjekt und überprüfen Sie dann, ob die db-Tabelle bei diesem Schlüssel null ist und geben Sie dann die Ansicht mit dem übergebenen tbl-Objekt Delete zurück .cshtml Ansicht des Objekts mit der Schaltfläche "Löschen" darunter. Die nächste Aktion, die ich geschrieben habe, ist die DeleteConfirmed(), die tatsächlich löscht und speichert Änderungen an der Datenbank (wenn ich das richtig verstehe?). Wie verknüpft dieser Button die DeleteConfirm() Aktion? Ich kann einfach nicht sehen, die Punkte zu verbinden, und ich möchte nicht weitermachen, bis ich es verstehe.

als Referenz, Controller-Methoden:

public ActionResult Delete(int? id) 
     { 
      using (MyBasicListAppEntities db = new MyBasicListAppEntities()) 
      { 
       if (id == null) 
       { 
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
       } 
       tblBasicList tbl = new tblBasicList(); 
       if(tbl == null) 
       { 
        return HttpNotFound(); 
       } 
       return View(tbl); 
      } 
     } 
     [HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public ActionResult DeleteConfirmed(int id) 
     { 
      using (MyBasicListAppEntities db = new MyBasicListAppEntities()) 
      { 
       // Find the row based on id from form (primary key) 
       tblBasicList tbl = db.tblBasicLists.Find(id); 
       // remove the whole row at that id 
       db.tblBasicLists.Remove(tbl); 
       db.SaveChanges(); 
      } 
      return RedirectToAction("MyToDoList", "Home"); 
     } 

Delete.cshtml:

@model MyBasicListApp2.Models.DB.tblBasicList 

@{ 
    ViewBag.Title = "Delete"; 
} 

<h2>Delete</h2> 

<h3>Are you sure you want to delete this?</h3> 
<div> 
    <h4>tblBasicList</h4> 
    <hr /> 
    <dl class="dl-horizontal"> 
     <dt> 
      @Html.DisplayNameFor(model => model.InputDate) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.InputDate) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.InputItem) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.InputItem) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.InputImportance) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.InputImportance) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.ItemCompletion) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.ItemCompletion) 
     </dd> 

    </dl> 

    @using (Html.BeginForm()) { 
     @Html.AntiForgeryToken() 

     <div class="form-actions no-color"> 
      <input type="submit" value="Delete" class="btn btn-default" /> | 
      @Html.ActionLink("Back to List", "Index") 
     </div> 
    } 
</div> 

Hauptseite mit der Liste: MyToDoList.cshtml:

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

@{ 
    ViewBag.Title = "MyToDoList"; 
} 

<h2>MyToDoList</h2> 

<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 }, null) 
     </td> 

    </tr> 
} 
</table> 

<h4>Would you like to add another item?</h4> 
@Html.ActionLink("Add more", "ToDoList", "List") 

die auch InputItem nur Shows als leeres Feld in der Delete.cshtml-Ansicht. Die anderen Anzeigen zeigen ihre Werte, aber nicht inputItem (weniger wichtig für mich, um es jetzt herauszufinden).

Antwort

1

Ihr ActionLink generiert also einen Hyperlink, was bedeutet, dass es eine GET-Anfrage an den Server ist.

MVC verfügt über einige intelligente Standardeinstellungen, die diesen Link zum Löschen auf Ihrem Controller senden.

Wenn Sie das Formular senden, das in delete.cshtml erstellt wird, wird dies jedoch eine POST-Anforderung sein (basierend auf den Standards, die von dem Html.BeginForm()-Helper generiert werden). Wenn Sie bemerken, das C# Attribut über die DeleteConfirm Aktion:

[HttpPost, ActionName("Delete")] 

, die den Rahmen ist zu sagen, dass diese Aktion für POST-Anfragen an der Delete Route für diesen Controller aufgerufen werden.

/** Bearbeiten für den zweiten Teil der Frage **/

Wenn Sie return View() in Ihrer Delete Aktion nennen, sind vorbei Sie es das tbl Objekt, das nur ein new tblBasicList() basierend auf dem Code ist, dass Sie Gesendet. Wenn für InputItem kein Standardwert vorhanden ist, ist es leer.

Wenn Sie das aktuelle Objekt möchten, müssen Sie es aus der Datenbank abrufen und dann das abgerufene Element an die Ansicht senden.

+0

Mann danke! Das hat mich verrückt gemacht. Irgendeine Idee warum das Input Item nicht in der View angezeigt wird? Ich habe debugged und der Wert ist da, und es wird aus der Tabelle entfernt. Es zeigt nur nicht in der Ansicht – Devon

+0

Nun, der Code, den Sie in Ihrer Aktion Löschen nur veröffentlicht, erstellt ein neues Objekt und sendet es an die Ansicht. Wenn der Standardwert für InputItem leer ist, wird dort nichts vorhanden sein.Wenn Sie die aktuellen Werte für alles, was mit dieser ID verknüpft ist, möchten, müssen Sie sie vor dem Rendern der Ansicht aus der DB abrufen. – Paul

+0

beiseite, ich bin ein großer Fan der Bücher von Agress MVC, für den Anfang: http://www.amazon.com/Pro-ASP-NET-Experts-Voice-ASP-Net/dp/1430265299/ref = sr_1_1? dh = UTF8 & qid = 1463099723 & sr = 8-1 & keywords = apress + asp.net + mvc – Paul

Verwandte Themen