2 votes

MVC .Net vue liste imbriquée de modèles

Je possède une classe abstraite avec 3 autres classes qui héritent de cette classe :

public abstract class AbstractTask
{
  [Key]
  public int ID {get; set;}
  [DisplayName("Tâche en vedette")]
  public bool Featured { get; set; }
  // diverses autres propriétés
}

public class HighLevelTask : AbstractTask
{
  [DisplayName("Description du flux de travail")]
  public String Workstream { get; set; }
  public virtual ICollection MidLevelTasks { get; set; }
}

public class MediumLevelTask : AbstractTask
{
  public int HighLevelTaskID { get; set; }
  public virtual ICollection DetailLevelTasks { get; set; }
}

public class DetailLevelTask : AbstractTask
{
 public int MidLevelTaskID { get; set; }
}

Ainsi, une tâche de haut niveau peut contenir un nombre quelconque de tâches de niveau intermédiaire et une tâche de niveau intermédiaire peut contenir un nombre quelconque de tâches de détail. Les tâches à tous les niveaux peuvent être définies comme "En vedette" par la propriété héritée de la classe abstraite.

Dans une vue HTML, je souhaite présenter une liste imbriquée des tâches "en vedette". Je pense donc à une action de contrôleur comme celle-ci pour collecter toutes les tâches "en vedette", mais je bloque mentalement sur la meilleure façon de présenter cela.

  var qryHighLevelTasks = from t in context.HighLevelTasks
                          where t.Featured == true
                          select t;
  var rsHighLevelTasks = qryHighLevelTasks.ToList();

  foreach(var highLevelTask in rsHighLevelTasks)
  {
     // obtenir toutes les tâches intermédiaires en vedette liées à cette tâche de haut niveau
     var qryMidTasks = from midLevelTasks in context.MidLevelTasks
                       where midLevelTasks.Featured == true
                       && midLevelTasks.HighLevelTaskID == highLevelTask.ID
                       select midLevelTasks;
     var rsMidLevelTasks = qryMidTasks.ToList();

     foreach (var midLevelTask in rsMidLevelTasks)
     {
        // obtenir toutes les tâches de détail en vedette liées à cette tâche de niveau intermédiaire
        var qryDetailTasks = from detailLevelTasks in context.DetailLevelTasks
                             where detailLevelTasks.Featured == true
                             && detailLevelTasks.MidLevelTaskID == midLevelTask.ID
                             select detailLevelTasks;
        var rsDetailLevelTasks = qryDetailTasks.ToList();                    
        }                
   }            

Peut-être devrais-je avoir un modèle composite pour représenter les tâches "en vedette" ? Ou y a-t-il une meilleure façon de faire ? Des recommandations ?

2voto

ElYusubov Points 4165

Je suggérerai la 'Vue Partielle' pour afficher la liste imbriquée des 'tâches en vedette'.

De plus, essayez de vous concentrer d'abord sur votre modèle de vue. Vous pouvez avoir une collection de 'tâches en vedette' dans votre modèle de vue, et passer cette collection à votre vue partielle à rendre. Voici quelques liens qui pourraient vous aider :

1) Vues Partielles et ViewModels Personnalisés fortement typés

2) Comment faire : travailler avec les données dans les Vues Partielles ASP.NET MVC ?

1voto

user965160 Points 28

Vous pouvez utiliser la projection LINQ pour récupérer les éléments imbriqués :

var featuredItems = from hl in context.HighLevelTasks where hl.Featured == true
                    select new
{
   MidLevelTasks = from md in context.MidLevelTask where md.MidLevelTaskID = h1.TaskID,
   DetailLevelTasks = from ll in context.DetailLevelTask where ll.LowLevelTaskID = md.MidLevelTaskID
};

Vous pouvez également utiliser des modèles d'éditeur pour afficher les vues imbriquées :

Vue principale :

foreach(item in Model.HighLevelTasks)
{
   @Html.EditorFor(item);  
}

Vue HighLevelTask :

foreach(item in Model.MidLevelTasks)
{
  @Html.EditorFor(item)
}

..dans un modèle similaire, créez des modèles d'éditeur pour les tâches de niveau moyen et de détail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X