2016-04-12 12 views
1

Okay, also ich habe mein ViewModel und ich verstehe, was der Controller macht, ich habe nur Schwierigkeiten bei der Implementierung. Ich weiß nicht, wie man einen Controller für das ViewModel programmiert, ich habe selbst versucht, es zu recherchieren und kann nichts finden.MVC 5 Hilfe ViewModel verstehen

Hier ist mein ViewModel, wie würde ich den Controller bauen? Nicht fragen Sie es für mich zu tun, nur wie es zu tun

public class ViewOrderViewModel 
{ 
    //From ORDER Table 
    public int OrderId { get; set; } 
    public System.DateTime OrderDate { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string PostalCode { get; set; } 
    public string Country { get; set; } 
    public string Email { get; set; } 
    public decimal Total { get; set; } 


    //from Products 
    public List<Product> Products { get; set; } 
} 

UPDATE

public class ViewOrderController : Controller 
    { 
     // GET: ViewOrder 
     public ActionResult ViewOrders() 
     { 

      var order = new Order(); 
      var viewModel = GetViewModel(order); 

      return View(viewModel); 
     } 



     public ViewOrderViewModel GetViewModel(Order orderObject) 
     { 
      ViewOrderViewModel viewModel = new ViewOrderViewModel(); 

      viewModel.OrderId = orderObject.OrderId; 
      viewModel.OrderDate = orderObject.OrderDate; 
      viewModel.FirstName = orderObject.FirstName; 
      viewModel.LastName = orderObject.LastName; 
      viewModel.City = orderObject.City; 
      viewModel.Address = orderObject.Address; 
      viewModel.Country = orderObject.Country; 
      viewModel.Email = orderObject.Email; 
      viewModel.PostalCode = orderObject.PostalCode; 
      viewModel.Total = orderObject.Total; 



      return viewModel; 
     } 
    } 

Noch unsicher darüber, wie die Liste der Produkte in der Viewmodel-Klasse in der Liste der Produkte zur Karte in der db

+0

Haben Sie die folgende QA überprüft: http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc – Hackerman

+0

Ich habe, ich habe durch eine Tonne von verschiedenen Foren gelesen, die aber ich kann nicht scheinen, meinen Controller zu schreiben, viele von ihnen nur über den Controller übergeben –

+0

https://msdn.microsoft.com/en-us/library/dd410269(v=vs.100).aspx – JB06

Antwort

2

Normalerweise wird Ihre Ansicht an das ViewModel "gebunden" werden. Es ist so, als würde ich sagen "Ok, ich bin die Ansicht für eine 'Bestellung' und ich muss mich nur um die Eigenschaften kümmern, die Sie in ViewOrderViewModel definiert haben".

Der Controller ist nicht für diese Bindung erforderlich. Die Bindung wird an der Spitze Ihrer Ansicht erklärt:

Order.cshtml

@Model MyProject.Web.ViewModels.ViewOrderViewModel 
<div> 
    <!-- Html for the view--> 
</div> 

Diese Sie in der Ansicht Eigenschaften auf dieses Modell zugreifen können. Razor hat einige Funktionen, die das Leben erleichtern. Zum Beispiel, wenn Sie die OrderId angezeigt werden soll es so aussehen könnte:

<span>OrderId: @Model.OrderId </span> 

Der Blick kümmert sich nicht darum, welche Werte für jede dieser Eigenschaften festgelegt sind, es kümmert sich nur, dass die Eigenschaften existieren. Wo die Steuerung ins Spiel kommt, wird diese Eigenschaften mit den Werten bevölkern Sie wollen, und dann auf die Ansicht, die das Ansichtsmodell vorbei:

public ActionResult Order() 
    { 
     var viewModel = new ViewOrderViewModel(); 
     // Load data into each property 
     viewModel.OrderId = 123; // etc.. 

     // Return it to the view. Asp.net knows to return 
     // it to the Order.cshtml view because the view 
     // and the controller action share the same name. 
     return View(viewModel); 
    } 

Edit: Als Antwort auf Ihre Fragen in den Kommentaren: Wenn Sie füllen Ihre Ansichtsmodell mit Werten aus einem anderen Modell (wie ein Datenbank-Modell) Sie einen Mapper wie so erstellen:

public ViewOrderViewModel GetViewModel(Order orderObject) 
    { 
     ViewOrderViewModel viewModel = new ViewOrderViewModel(); 
     viewModel.OrderId = orderObject.OrderId; 
     viewModel.FirstName = orderObject.FirstName; 
     // etc... 

     return viewModel; 
    } 

und dann in Ihrem Controller würden Sie so etwas tun:

// var order = new Order() 
var viewModel = GetViewModel(order); 
+0

Das ist wirklich so hilfreich, danke! Nur eine Frage, ich folge dir, aber wenn ich Daten definiere; viewModel.OrderId = 123; usw., wie würde ich ihm sagen, die Daten aus der Auftragsklasse zu übernehmen? Zum Beispiel so etwas wie viewModel.OrderId = Order.OrderId, Wie würde das funktionieren? –

+0

Sie müssten genau das tun: viewModel.OrderId = Order.OrderId. Eine übliche Vorgehensweise besteht darin, eine "Mapping" -Funktion zu erstellen, bei der Sie ein Order-Objekt übergeben und ein instanziiertes ViewModel-Objekt zurückgibt. – Elliott

+0

Wie würde ich die Mapping-Funktion erstellen?Entschuldigung für die vereinfachten Fragen, die ich noch lerne und das wird sehr geschätzt –