2017-07-18 5 views
0

im ganz neu in MVC und ist es schwer, Ressourcen auf Sachen zu finden, wie diesebester Weg, um Daten von entrys in MVC zu berechnen

Ich habe ein Modell:

public class Distance 
{ 
    public int Id { get; set; } 
    [DisplayName("Distance Run")] 
    public float DistanceRun { get; set; } 

    [DisplayName("Chose a date")] 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime _Date { get; set; } 

    [DisplayName("Any Addtional Comments")] 
    public String AdditionalComments { get; set; } 
} 

Ich möchte angezeigt werden auf meiner Sicht auf dieses Modell die gesamte Strecke laufen, in der oberen Ecke. Wäre es am besten, das Ganze zu verwenden:

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.DistanceRun)Km 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item._Date) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.AdditionalComments) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
      @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
     </td> 
    </tr> 

Foreach-Schleife es zu berechnen, indem jede Entfernung KM Hinzufügen oder wäre es sinnvoll, eine in der Nähe identische Ansicht mit einer eigenen separaten Aktion in einem Controller zu erstellen Entfernung zu berechnen?

+0

Also ist das Modell der Ansicht tatsächlich eine Sammlung dieses Modellobjekts? Wäre nicht die "Gesamtdistanz" dann einfach "Model.Sum (d => d.DistanceRun)"? – David

+0

@David Oh, tut mir leid, ich wusste nicht einmal, dass du das tun könntest. Wenn Sie das als Antwort schreiben, werde ich es gerne annehmen. – user3042332

Antwort

2

Aus dem Code in der Ansicht sieht es so aus, als ob das Ansichtsmodell tatsächlich eine Sammlung dieses bestimmten Modells ist. Etwas wie:

@model IEnumerable<Distance> 

(oder etwas ähnliches, macht es kaum einen Unterschied für diese)

Wenn das der Fall ist, dann Ihrer Ansicht nach bereits die Daten hat es braucht, man muss nur daran binden müssen. Ein berechneter Wert benötigt keine beidseitige Bindung, Sie können ihn also einfach auf der Seite ausgeben, wo Sie möchten. Etwas so einfaches wie folgt aus:

Total Distance: @Model.Sum(d => d.DistanceRun) 

Sie umfassen können jede Formatierung Sie mögen, vielleicht durch eine .ToString() mit einem benutzerdefinierten Format anhängen. Aber die Bindung an das Modell ist in diesem Fall so einfach, als würde man den Wert einfach so ausgeben.

+0

Ich wusste nicht, dass diese Ansicht mit dem Modell kommunizieren kann, bevor – Rise

+2

@Rise: Die Ansicht kann jede Information lesen, die auf dem ihr zur Verfügung gestellten Modell steht. Das ist Teil der Natur des MVC-Musters im Allgemeinen. – David

1

Wie aus den Kommentaren hervorgeht, haben Sie tatsächlich eine Sammlung von Distance als Modell für die Ansicht. Ich schlage vor, Sie ein neues Ansichtsmodell für diese Ansicht erstellen, wie:

public class DistancesViewModel 
{ 
    public ICollection<Distance> Distances { get; set; } 

    public int TotalDistanceRun { 
     get { 
      return Distances.Sum(d => d.DistanceRun) 
     } 
    } 
} 

Dann binden Sie Ihre Ansicht zu diesem Ansichtsmodell statt. Sie können dann auf zugreifen und die Entfernungen immer noch in einer Schleife usw. über Model.Distances verwenden.

Der Vorteil für mich in diesem Ansatz basiert auf der Ansicht zu vermeiden Code, wie Sie eventuell ändern muß, wie die Gesamtdistanz zu einem bestimmten Zeitpunkt berechnet wird und auf dem Ansichtsmodell zu tun ist sauberer.

Verwandte Themen