2016-06-10 16 views
1

Ich habe am Montag eine Prüfung und ich möchte Sie fragen, ob jemand weiß, wie beispielsweise Bearbeitungen in einem ProductView am besten funktionieren. Mehr oder weniger geht es um den Code innerhalb des ProductControllers.MVC 2 EF 4.0 Korrekter Umgang mit Bearbeitungen für Produkte wie zB

Vielleicht kennt jemand eine sauberere Lösungen als meine zwei Versuche.

Dies ist die erste Art, wie ich tat:

Ich habe dies in der get meiner bearbeiten

public ActionResult Edit(int id) 
    { 
     var productToEdit = (from p in db.Products 
          where p.ProductId == id 
          select p).First(); 

     return View(productToEdit); 

    } 

Diese in den Posten des Edit:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(Product productToEdit) 
    { 
     try 
     { 
      // TODO: Add update logic here 
      var originalProducts = (from p in db.Products 
            where p.ProductId == productToEdit.ProductId 
            select p).First(); 

      db.ApplyCurrentValues(originalProducts.EntityKey.EntitySetName, productToEdit); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     catch 
     { 
      return View(); 
     } 
    } 

Ist das ein gute saubere Lösung?

enter image description here

Die Prüfung in MVC 2 mit EF 4.0 getan werden muss:

die zweite Lösung Dies würde ich gedacht sein.

Antwort

0

public Action Get (int id) // die Methodennamen ändern zu bekommen { var productToEdit = (von p in db.Products wo p.ProductId == id select p) .FirstOrDefault(); // Verwenden Sie immer first ordefault statt first

return View(productToEdit); 

} 

Verwenden Sie zweiten Ansatz.

+0

Warum Sekunde? Kannst du mir genauer erklären, welche Vorteile ich habe, wenn ich zweiten vs ersten benutze? – bfmv991

2

Sie sollten nie einen Catch-All try Block machen. Sie riskieren das Schlucken aller möglichen Ausnahmen, unabhängig davon, dass das Objekt nicht in der DB existiert.

Hier sollten Sie jedoch nicht einmal einen try Block verwenden. Es gibt nur einen Anwendungsfall Sie besorgt sind: keine Übereinstimmung in der Datenbank zu finden, so ist es vorzuziehen, verwenden FirstOrDefault statt First und dann das null -Wertes Szenario abdecken:

public ActionResult Edit(int id, Product productToEdit) 
{ 
    var originalProduct = db.Products.FirstOrDefault(p.ProductId == id); 
    if (originalProduct == null) 
    { 
     return new HttpNotFoundResult(); 
    } 

    // do update 

    return View(productToEdit); 
} 

Hinweis ein paar Dinge auch :

  1. Der id Parameter sollte noch übergeben werden. Es ist ein Teil der URL und Sie sollten das verwenden, anstatt das, was gepostet wird, um das richtige Produkt zu finden. Der gebuchte Wert kann geändert werden, aber Sie können den Parameter id in der URL nicht ändern, ohne eine vollständig andere Ressource anzufordern.

  2. Wenn Sie eine Sicht auf eine Nachbearbeitung zurückgeben, müssen Sie das gebuchte Modell übergeben. Das einzige Mal, an dem Sie eine Sicht zurückgeben, ist, wenn ein Validierungsfehler vorliegt. Wenn Sie das veröffentlichte Modell nicht übergeben, kann der Benutzer die vorhandenen Werte nicht aktualisieren, um diese Fehler zu beheben. Stattdessen müssen sie einfach komplett neu beginnen.

  3. Ich benutze Entity Framework Abfrage Syntax hier. Obwohl Sie können LINQ to SQL-Syntax verwenden, ist es ausführlicher, weniger lesbar und nicht-Standard.

  4. Ich verwende FirstOrDefault anstatt First zu Demonstrationszwecken, aber hier wäre es eigentlich am meisten Sinn macht, nur db.Products.Find(id) zu verwenden.

+0

Wie würden Sie das Modell in der 'return View' übergeben? und du würdest lieber 'var originalProduct = db.Products.Find (id)' als wie ich es tun? – bfmv991

+0

Es ist richtig im obigen Beispielcode: 'return View (productToEdit);'. Und, ja, die LINQ to SQL-Syntax ist eine Abscheulichkeit und macht Ihren Code schwerer zu lesen und zu verstehen. –