我有一个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>
答案 0 :(得分:3)
我会重构你的视图模型。如果您要在集合中表示集合,那么您的视图模型最好反映出来。
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); %>
<% } %>
答案 1 :(得分:2)
尝试使用ORM框架之一(例如NHibernate,ADO.NET Entity框架,Linq to SQL,...)之后,与您的实体制作有效的映射数据库模式,然后您可以获得一个类别有很多零售商,构建ViewModel并绑定到View。如果要使其复杂化,可以自定义Model Binder以在View和Controller之间进行绑定。 IMHO。