ASP.NET MVC 2 - Использование EF4 с лесами List - PullRequest
0 голосов
/ 22 октября 2010

Я хочу показать список игровых обзоров для редактирования. Это просто сделать с помощью встроенных скаффолдингов 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 Ответ

2 голосов
/ 22 октября 2010

Я бы порекомендовал вам использовать модель представления и включить свойства, необходимые для представления:

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 и вы не пожалеете об этом.

...