2017-02-15 2 views
0

Ich bin neu in asp.net mvc und Viewmodels sind neu für mich auch. Ich habe eine Ansicht, die Produkte zeigt. In der Ansicht möchte ich alle Produkte in einem div zeigen. dann in einem anderen div möchte ich nur die featuredProducts und in einem anderen div die Toprate zeigen. Ich versuche, verschiedene Viewmodels für jeden zu verwenden, weil ich diese auf einer anderen Seite wieder verwenden werde. Ist das der richtige Weg dies zu tun und wenn nicht was ist? Auch wie kann ich dies mit Viewmodels nur für die Übung tun.Mehrere ViewModels in Ansicht asp.net MVC

Domain Model

public class Product 
{ 
    public int ProductId { get; set; } 
    public string SKU { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public Boolean FeaturedProduct { get; set; } 
    public Boolean NewProduct { get; set; } 
    public Boolean TopRated { get; set; } 
    public Boolean BestSellers { get; set; } 
} 

ViewModelProductsMain (Parent)

public class ViewModelProductsMain 
{ 
    public ViewModelProducts Products{ get; set; } 
    public ViewModelTopRated TopRated{ get; set; } 
    public ViewModelFeatured Featured{ get; set; } 
} 

Viewmodels (Kinder)

public class ViewModelProducts (Child) 
//all products 
{ 
    public int ProductId { get; set; } 
    public string SKU { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 
public class ViewModelTopRated (Child) 
//all products with TopRated true 
{ 
    public int ProductId { get; set; } 
    public string SKU { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

public class ViewModelFeatured (Child) 
//all products with Featured true 
{ 
    public int ProductId { get; set; } 
    public string SKU { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

-Controller

public ActionResult Index() 
{ 
    //How do I, instantiate and populate the model 
    var model = new ViewModelProductsMain(); 
    return View(model); 
} 

Ansicht

@model IEnumerable<myProject.ViewModels.ViewModelProductsMain > 
+1

Kein bro alle Modelle enthält gleiche Eigenschaft –

+2

kann ein einziges Modell bringt machen diese Arbeit –

+0

One View-Modell namens 'ProductsViewModel' und dann' ViewModelProductsMain' aber ich vermute, dass du wirklich 'public IEnumerable Products {get; einstellen; } 'da es eine Sammlung ist (und vielleicht auch Featured ist?) –

Antwort

0

Zuerst sollten Sie ViewModelProductsMain Um dies ändern:

public class ViewModelProductsMain 
    { 
     public List<ViewModelProducts> Products { get; set; } 

     public List<ViewModelTopRated> TopRated { get; set; } 

     public List<ViewModelFeatured> Featured { get; set; } 
    } 

und für Ihr Produkt in der Ansicht angezeigt werden diesen Code schreiben sollte:

@model WebApplication1.Models.ViewModelProductsMain 

@{ 
    ViewBag.Title = "Index"; 
} 

<div id="AllProducts"> 
    @foreach (var item in Model.Products.ToList()) 
    { 
     @item.Name 
     <hr/> 
    } 
</div> 

<div id="TopRated"> 
    @foreach (var item in Model.TopRated.ToList()) 
    { 
     @item.Name 
     <hr /> 
    } 
</div> 

    <div id="Featured"> 
     @foreach (var item in Model.TopRated.ToList()) 
     { 
      @item.Name 
      <hr /> 
     } 
    </div> 
0

i Öffentlichkeit sehen int ProductId {erhalten; einstellen; } in allen deinen Modellen. Es scheint so, als ob Sie in Ihren Daten nach fremden Schlüsseln denken, damit Sie Ihr Ansichtsmodell besser als in ViewModelProductsMain darstellen können.

so:

public class Product 
{ 
    public int ProductId { get; set; } 
    public string SKU { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

public class ViewModelProducts { 
    public virtual List<Product> Products { get; set; } 
} 

tun, was Sie oben sehen zu ViewModelFeatured und ViewModelTopRated zu

dann:

public class ViewModelProductsMain 
{ 

    public ViewModelProductsMain() 
    { 
     this.Products = new List<ViewModelProducts>(); 
     this.TopRated = new List<ViewModelTopRated>(); 
     this.Featured = new List<ViewModelFeatured>(); 
    } 
    public List<ViewModelProducts> Products { get; set; } 

    public List<ViewModelTopRated> TopRated { get; set; } 

    public List<ViewModelFeatured> Featured { get; set; } 

}

vergessen Sie nicht zu schreiben ein Konstruktor für dich r ViewModelProductsMain wenn Sie nicht Konstruktor machen .it null reference error

+0

Ich denke, das macht Sinn. Jedes Viewmodel ist immer noch eine eigene Klasse - korrekt? und wie schreibe ich den Konstruktor das ist, was ich habe immer noch ein Problem mit – dnice

+0

@Dince in diesem Fall ist jedes View-Modell Liste der spezifischen Klasse ... und nur eine einfache Suche über Konstruktor wird Ihnen helfen, auf Google .. –