Можете ли вы помочь с этой проблемой MVC ViewModel? - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть проблема с представлением MVC, которую я просто не могу решить.Вот оно.

1) У меня есть индексное представление, которое отображает список розничных продавцов с данными из таблицы розничных торговцев.Пока все хорошо.

2) Я также хочу включить категории розничных продавцов для каждого розничного торговца, которые хранятся в таблице RetailersCategories, где у каждого розничного торговца может быть несколько категорий

Я пробовал несколько вещейно не могу заставить это работать.Самое близкое к тому, что я хотел, это использование модели представления.Я включил код ниже.

Я действительно получаю правильные данные, но получаю все записи продавца, а затем все записи категорий.

Что мне нужно, так это одна запись ритейлера за раз со всеми категориями, которые относятся к этому ритейлеру.

Может кто-нибудь показать мне, как мне этого добиться?

//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>

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Я бы реорганизовал ваши модели просмотра.Если вы собираетесь представлять коллекцию в коллекции, лучше всего ваши модели представлений отразят это.

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;
    }
}

и отобразят ее так, что

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

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

вместо этого вызовите это в вашем RetailerSummaryPartialиндексного представления

<%
    foreach (var category in ViewData.Model.RetailerCategories) 
       {%>
    <% Html.RenderPartial("RetailerCategoryPartial", category); %>
    <% } %>
2 голосов
/ 01 декабря 2010

Попробуйте использовать одну из платформ ORM (например, NHibernate, инфраструктуру ADO.NET Entity, Linq to SQL, ...). После этого создайте действительную схему сопоставления БД с вашей сущностью, и тогда вы сможете получить одну категорию с несколькими продавцами. Построить ViewModel и привязку к View. Если вы хотите сделать его сложным, можете настроить связыватель модели для привязки между представлением и контроллером. ИМХО.

...