2017-08-15 3 views
2

Ich lehre MVC selbst, und habe Schwierigkeiten. Meine Datenbank enthält eine Tabelle für Bier und eine Tabelle für Brauereien. Natürlich gibt es eine Fremdschlüsseleinschränkung, um sicherzustellen, dass ein Bier eine Brauerei hat. Diese Einschränkung ist eine Einschränkung "keine Aktion", die verhindern soll, dass eine Brauerei gelöscht wird, wenn sich Bier für diese Brauerei in der Datenbank befindet.Wo ist der richtige Ort für diese Art von Logik?

Ich bin die Index-Seite für die Brauereien implementieren, und der automatisch generierte Code listet die Brauereien zusammen mit Bearbeiten, Details und Löschen. So weit, ist es gut. Wenn versucht wird, eine Brauerei zu löschen, die Beers enthält, schlägt das Löschen aufgrund der Fremdschlüsseleinschränkung fehl.

Aber es scheint besser, die Löschoption zu verweigern, wenn es nicht gelingen kann. Dies führt zu Code in der Ansicht wie folgt aus: -

@Html.ActionLink("Edit", "Edit", new { id=item.BreweryID }) | 
@Html.ActionLink("Details", "Details", new { id=item.BreweryID }) 
@if(item.Beers.Count == 0) 
{ 
    <text> |</text> 
    @Html.ActionLink("Delete", "Delete", new { id=item.BreweryID }) 
} 

Es scheint mir, dass das Modell-Design in den Blick zu sickern, aber ich kann keine Alternative sehen; Der Link Löschen muss angezeigt werden oder nicht und die Ansicht muss dies tun.

Wie sollte diese Art von Sache angegangen werden?

+0

Beachten Sie, dass in MVC, Ihre Ansichten fest an den definierten Modellen gekoppelt werden, so dass ein Modell der Definition in der zugehörigen Ansichten Nutzung ist gängige Praxis. – pnm

+0

In der Tat. Das ist der Punkt, an dem man überhaupt ein stark typisiertes Modell hat. Es ist nichts falsch daran, dass die Ansicht mit dem Modell interagiert. Das ist es, was es tun soll. Sie sollten nur auf übermäßige Logik aus Ihrer Sicht achten. Einfach die Anzahl der Sammlung zu zählen ist kein Problem, aber wenn Sie Dinge wie das Hinzufügen von 'Where'-Klauseln' Selects' usw. finden, sollten Sie diese Dinge in die Modellklasse mischen. –

Antwort

4

Es gibt kaum ein Problem mit "undicht". Wenn die Ansicht bestimmte Daten benötigt und diese Daten im Modell verfügbar sind, besteht kein Problem beim Zugriff auf die Daten. Es ist eine sehr häufige Sache.

Wenn Sie lieber nicht auf die .Beers Sammlung in der Ansicht zugreifen möchten, können Sie dem Brewery ViewModel eine Eigenschaft bool HasBeers hinzufügen. Sie können diese Eigenschaft dann im Controller festlegen und in der Ansicht verwenden, sodass die View nicht auf weitere Informationen zugreift, auf die sie zugreifen soll.

Beispielcode:

public class BreweryViewModel 
{ 
    public bool HasBeers { get; set; } 
    // other properties 
} 

public class BreweryController 
{ 
    public ActionResult Index() 
    { 
     var breweryVM = ... 
     var beers = ... 

     breweryVM.HasBeers = beers.Any(); 

     return View(breweryVM); 
    } 
} 
Verwandte Themen