2015-12-08 3 views
1

(Toutes mes excuses pour le titre .. était difficile à clouer)Itère une collection de ViewModels découlant d'un AbstractViewModel et DisplayTemplates rend les deux DisplayTemplates

J'ai une situation où un contrôleur construira une liste qui contiendra un ensemble de ViewModels dérivé de la classe de base abstraite. J'utilise ensuite des modèles d'affichage pour rendre le contenu de manière appropriée, mais lorsque je navigue vers l'URL, il semble que le rendu soit fait deux fois. Voici mon code

public abstract class AbstractItemViewModel 
{ 
} 

public class TypeAViewModel : AbstractItemViewModel 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Body { get; set; } 
} 

public class TypeBViewModel : AbstractItemViewModel 
{ 
    public string Title { get; set; } 
    public List<string> Items { get; set; } 
} 

Puis mon contrôleur construit un cas de test en tant que tel.

public class HomeController : BaseController 
{ 
    // GET: Home 
    public ActionResult Index() 
    { 
     List<AbstractItemViewModel> items = new List<AbstractItemViewModel>(); 

     items.Add(new TypeAViewModel() { ID = 1, Title = "Test A", Body = "This is some body content." }); 
     items.Add(new TypeBViewModel() { Title = "Test B", Items = new List<string>() { "Line 1", "Line 2", "Line 3" } }); 
     return View(items); 
    } 
} 

... et qu'il ne manque ici est la classe du contrôleur de base (rien de spécial) ..

public class BaseController : Controller 
{ 

} 

.. et voici la vue ...

@using xxx.ViewModels 
@model List<AbstractItemViewModel> 

@{ 
    ViewBag.Title = "Home"; 
} 


<h1>@Model.Count()</h1> 
<div class="container"> 
    <div class="row"> 
     @foreach (AbstractItemViewModel item in Model) 
     { 
      <div class="col-xs-12"> 
       @Html.DisplayForModel(item) 
      </div> 
      <p>space</p> 
     } 
    </div> 
</div> 

. et 2 modèles d'affichage TypeAViewModel.cshtml

@using xxx.ViewModels 
@model TypeAViewModel 

<h2>@Model.Title (@Model.ID)</h2> 
<p>@Model.Body</p> 

.. et ... TypeBViewModel.cshtml

@using xxx.ViewModels 
@model TypeBViewModel 

<h2>@Model.Title</h2> 
<ul> 
    @foreach (string s in Model.Items) 
    { 
     <li>@s</li> 
    } 
</ul> 

En sortie que je reçois.

Test A (1) Ceci est une partie du contenu du corps.

Essai B Ligne 1 Ligne 2 Ligne 3 Surface

Test A (1) Ceci est une partie du contenu du corps.

test B Ligne 1 Ligne 2 Ligne 3 espace

Comme vous pouvez le voir semble rendre la chose deux fois. J'ai placé un point d'arrêt et franchi la vue d'index à définitivement ne répète pas la boucle en tant que telle. Quelqu'un voit-il ce qui me manque?

Répondre

1

Vous devez utiliser DisplayFor aide Html au lieu de DisplayForModel, depuis DisplayForModel envoie l'intégralité du modèle (dans ce cas, la liste complète des passés dans les modèles - descendants de AbstractItemViewModel, item est en fait que des données supplémentaires au modèle adopté en) aux vues . En fait, pour chaque article de foreach, le modèle complet est passé à votre vue; par exemple. Si vous aviez 3 modèles dans votre liste, ils seraient rendus 3 fois chacun (si 4, puis 4 fois, etc.). Pour que cela fonctionne, utilisez cette aide: @Html.DisplayFor(model => item) à l'intérieur foreach déclaration au lieu de DisplayForModel.

+0

Excellent .. merci –