2010-11-30 29 views
0

J'ai un problème avec une vue MVC que je n'arrive pas à résoudre. C'est ici.Pouvez-vous nous aider avec ce problème MVC ViewModel?

1) J'ai une vue d'index qui affiche une liste de détaillants avec des données de la table des détaillants. Jusqu'ici tout va bien.

2) Je veux aussi inclure les catégories de détaillants pour chaque détaillant qui sont stockés dans une table RetailersCategories où chaque détaillant peut avoir plusieurs catégories

J'ai essayé quelques petites choses, mais ne peut pas sembler faire ce travail. Le plus proche je suis venu à ce que je voulais utiliser un modèle de vue. J'ai inclus le code ci-dessous.

En fait, je récupère les bonnes données, mais je reçois tous les enregistrements des détaillants, puis tous les enregistrements de catégories.

Ce dont j'ai besoin, c'est d'un enregistrement détaillant à la fois avec toutes les catégories qui se rapportent à ce détaillant. Est-ce que n'importe qui peut me montrer comment je peux réaliser ceci?

//Controller 

public ActionResult Index(int? page, int country) 
{ 
    var viewdata = new retailersIndexViewModel(_retailerRepository.GetAllRetailersByCountry(country), _retailerRepository.GetRetailerCategories()); 
    return View(viewdata);  
} 

// ViewModel 

public class RetailersIndexViewModel 
{   
    public IEnumerable<RetailersShipping> RetailerShipping { get; set; } 
    public IEnumerable<RetailersCategory> RetailerCategories { get; set; } 

    public RetailersIndexViewModel(IEnumerable<RetailersShipping> retailer, IEnumerable<RetailersCategory> retailercategory) 
    { 
     this.RetailerShipping = retailer; 
     this.RetailerCategories = retailercategory; 
    } 
} 


//IndexView 

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Inner.Master" Inherits="System.Web.Mvc.ViewPage<RetailersIndexViewModel>" %> 

<% Html.RenderPartial("RetailerSummaryPartial", this.ViewData.Model.RetailerShipping); %> 
<div id="retailer_index_categories"> 

<% 
    foreach (RetailersCategory category in ViewData.Model.RetailerCategories) 
    {%> 
     <% Html.RenderPartial("RetailerCategoryPartial", category); %> 
    <% } %> 


// RetailerSummaryPartial 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<RetailersShipping>>" %> 

<div id="retailer_partial_summary"> 
<% foreach (var retailer in Model) 
{ %> 
    <div id="retailer_index_image"> 
     <img src="<%=Html.Encode(retailer.Retailer.Country.Image) %>" title="<%= Html.Encode(retailer.Retailer.Name) %>>" alt="<%= Html.Encode(retailer.Retailer.Name) %>" class="main-image" /> 
     <br /> 
    </div> 
    <div id="retailer_index_logo"> 
     <img src="<%=Html.Encode(retailer.Retailer.Logo) %>" title="<%= Html.Encode(retailer.Retailer.Name) %>>" alt="<%= Html.Encode(retailer.Retailer.Name) %>" class="main-image" /> 
    </div> 
    <div id="retailer_index_name_comment"> 
     <%= Html.Encode(retailer.Retailer.Name)%><br /> 
     <span><%if (retailer.Retailer.CountryId == retailer.Retailer.CountryId) %> 
       <%= Html.Encode(retailer.Retailer.LocalComment)%> 
       <%= Html.Encode(retailer.Retailer.IntComment)%> 
     </span> 
    </div> 

<% } %> 
</div> 


//RetailerCategoryPartial 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<RetailersCategory>" %> 
<div id="retailer_index_categories"> 
    <%= Html.Encode(Model.Category.CategoryName) %> 
</div> 
+0

Êtes-vous par hasard en utilisant Entity Framework 4? – gligoran

+0

linq to sql actuellement – Cunners

+0

Vous recherchez des conseils sur la façon de structurer votre ViewModel ou comment le hacher avec le modèle de vue actuel? Idéalement, vous auriez simplement une liste de catégories sur chaque détaillant ... au lieu d'essayer de rejoindre les catégories dans la vue ... – dotjoe

Répondre

3

Je refactoriserais vos modèles de vue. Si vous souhaitez représenter une collection au sein d'une collection, il est préférable que vos modèles de vue reflètent cela.

public class RetailersIndexViewModel { 

    public IEnumerable<RetailersShippingViewModel> RetailerShippings { get; set; } 

    public RetailersIndexViewModel(IEnumerable<RetailersShipping> shippings) 
    { 
     this.RetailerShippings = shipping; 
     foreach(var shipping in shippings) 
     { 
      shipping.RetailerCategories = shipping.Categories // assuming Categories is referenced in your Retailer Shipping class; 
     } 
    } 
} 

public class RetailerShippingViewModel { 

    public IEnumerable<RetailersCategory> RetailerCategories { get; set; } 

    public RetailersIndexViewModel(IEnumerable<RetailersCategory> retailercategories) 
    { 
     this.RetailerCategories = retailercategories; 
    } 
} 

et le rendre comme si

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Inner.Master" Inherits="System.Web.Mvc.ViewPage<RetailersIndexViewModel>" %> 

    <% foreach(var shipping in Model.RetailerShippings) 
     { 
      Html.RenderPartial("RetailerSummaryPartial", shipping); 
     }%> 

appel dans votre RetailerSummaryPartial au lieu de l'affichage de l'index

<% 
    foreach (var category in ViewData.Model.RetailerCategories) 
     {%> 
    <% Html.RenderPartial("RetailerCategoryPartial", category); %> 
    <% } %> 
2

Essayez d'utiliser l'un des cadres ORM (tels que NHibernate, ADO.NET Entity Framework, LINQ to SQL, ...) Une fois que le fait de schéma db mappage valide avec votre entité, puis vous pouvez obtenir un catégorie ont de nombreux détaillants, construisent le ViewModel et se lient à View. Si vous voulez le rendre complexe, vous pouvez personnaliser le classeur modèle pour la liaison entre View et Controller. A MON HUMBLE AVIS.