2010-10-21 14 views
0

Je souhaite afficher une liste d'avis de parties à modifier. C'est simple à faire avec l'échafaudage intégré de VS, mais je suis confronté à des problèmes de gestion des EntityCollections associées à une entité. Ma méthode de contrôleur est actuellement:ASP.NET MVC 2 - Utilisation de EF4 avec échafaudage List

public ActionResult ShowReviews() 
{ 
    var reviews = _siteDB.Games.Include("Genre").Include("Platforms").Include("Content").ToList(); 
    return View(reviews); 
} 

Comme vous pouvez le voir, Platforms est pluriel. Chaque jeu peut être sur une multitude de plateformes (PS3, XBox 360, etc.).

Je souhaite avoir les noms des plates-formes en tant que chaîne CSV dans ma liste. Je ne suis pas sûr de savoir comment le faire avec élégance car je dois d'abord percer les plates-formes, extraire leurs noms, et les ajouter à une chaîne vide. J'ai juste l'impression que j'y vais de la mauvaise façon, et l'introduction de la logique du façonnement des résultats me semble erronée. Voici ma vue telle qu'elle est maintenant. S'il vous plaît laissez-moi savoir s'il y a une meilleure façon de le faire.

<%@ 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> 

Répondre

2

Je vous recommande d'utiliser un modèle de vue et les propriétés comprennent nécessaires par la vue:

public class ReviewViewModel 
{ 
    public string Title { get; set; } 
    public string Genre { get; set; } 
    public string Platforms { get; set; } 
    ... 
} 

et faire toutes les projections nécessaires dans votre contrôleur:

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

Et maintenant votre vue deviendra beaucoup plus propre:

<%@ 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> 

et un petit modèle d'affichage pour l'examen (~/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> 

prendre enfin un oeil à MVCContrib Grid et vous ne le regretterez pas.

+0

Merci. Je n'étais pas sûr si un modèle de vue était la voie à suivre ou non. En voyant votre code, cela semble être un choix évident. –