我想显示一个游戏评论列表进行编辑。这对于VS'内置脚手架很简单,但我遇到了处理实体关联的EntityCollections的问题。我的控制器方法目前是:
public ActionResult ShowReviews()
{
var reviews = _siteDB.Games.Include("Genre").Include("Platforms").Include("Content").ToList();
return View(reviews);
}
如您所见,平台是复数形式。每个游戏都可以在多个平台上(PS3,XBox 360等)。
我想在我的列表中将平台的名称作为CSV字符串。我只是不确定如何优雅地做到这一点,因为我首先需要钻进平台,提取他们的名字,并将它们附加到一个空字符串。我只是觉得我的方式错了,在我看来,结果整形逻辑的引入让我感到错误。这是我现在的观点。如果有更好的方法,请告诉我。
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<HandiGamer.Models.Game>>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
ShowReviews
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>ShowReviews</h2>
<table>
<tr>
<th></th>
<th>
Game
</th>
<th>
Review Title
</th>
<th>
Genre
</th>
<th>
Platforms
</th>
<th>
Score
</th>
<th>
Last Modified
</th>
</tr>
<% foreach (var item in Model) { %>
<% var platformInfo = item.Platforms.ToList();
string platformNameList = "";
foreach (var platformName in platformInfo) {
platformNameList += platformName.Name + " ";
}
%>
<tr>
<td>
<%: Html.ActionLink("Edit", "Edit", new { id=item.GameID }) %> |
<%: Html.ActionLink("Details", "Details", new { id=item.GameID })%>
</td>
<td>
<%: item.GameTitle %>
</td>
<td>
<%: item.Genre.Name %>
</td>
<td>
<%: platformNameList %>
</td>
<td>
<%: item.ReviewScore %>
</td>
<td>
<%: item.Content.LastModified %>
</td>
</tr>
<% } %>
</table>
<p>
<%: Html.ActionLink("Create New", "CreateReview") %>
</p>
</asp:Content>
答案 0 :(得分:2)
我建议您使用视图模型并包含视图所需的属性:
public class ReviewViewModel
{
public string Title { get; set; }
public string Genre { get; set; }
public string Platforms { get; set; }
...
}
并在您的控制器中执行所有必要的投影:
public ActionResult ShowReviews()
{
var reviews = _siteDB.Games.Include("Genre").Include("Platforms").Include("Content").ToList();
var model = reviews.Select(r => new {
Title = r.GameTitle,
Genre = r.Genre.Name,
Platforms = string.Join(" ", r.Platforms.Select(p => p.Name).ToArray());
});
return View(model);
}
现在你的观点会更加清晰:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<HandiGamer.Models.ReviewViewModel>>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
ShowReviews
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>ShowReviews</h2>
<table>
<thead>
<tr>
<th>
Title
</th>
<th>
Genre
</th>
<th>
Genre
</th>
<th>
Platforms
</th>
</tr>
</thead>
<tbody>
<%: Html.DisplayForModel() %>
</tbody>
</table>
<p>
<%: Html.ActionLink("Create New", "CreateReview") %>
</p>
</asp:Content>
以及用于审核的小型显示模板(~/Views/Home/DisplayTemplate/ReviewViewModel.ascx
):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<HandiGamer.Models.ReviewViewModel>" %>
<tr>
<td>
<%: Model.Title %>
</td>
<td>
<%: Model.Genre %>
</td>
<td>
<%: Model.Platforms %>
</td>
</tr>
最后看看MVCContrib Grid,你不会后悔。