ASP.NET MVC 2 - 将EF4与List脚手架配合使用

时间:2010-10-21 21:10:58

标签: asp.net-mvc-2 views entity-framework-4

我想显示一个游戏评论列表进行编辑。这对于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>

1 个答案:

答案 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,你不会后悔。