2011-04-15 8 views
2

Je suis curieux de connaître la meilleure façon d'aborder le scénario suivant:Comment lier un ViewModel possédant des propriétés sub-viewmodel?

public class LittleThingViewModel 
{ 
    public string Id{ get; set; } 
    public string Name { get; set; } 
    public string Location { get; set; } 
} 

public class BigThingViewModel 
{ 
    public LittleThingViewModel little1 {get; set; } 
    public LittleThingViewModel little2 {get; set; } 
    public string propA {get; set; } 
    public string propB {get; set; } 
    public string propC {get; set; } 
} 

Dans l'action initiale de mon contrôleur CREER, je POPULATE deux LittleThingViewModels, les assigner à une nouvelle BigThingViewModel et le transmettre à la strongly- vue typée. J'utilise ensuite EditorFor pour rendre les contrôles d'édition pour les propriétés BigThing A, B et C.

Quelle est la meilleure technique pour rendre automatiquement les LittleThingViewModels à la forme de sorte que lorsque je publie sur mon contrôleur, il se lie automatiquement? (Mon but est d'afficher uniquement le nom et garder les autres propriétés cachées)

public ActionResult Create(BigThingViewModel b) 

je trouve que je pouvais rendre A, B et propriétés C en plus de chaque propriété individuelle des deux LittleThing sous-viewmodels et il se lie avec succès BigThingViewModel lors du POST:

Html.DisplayFor(model=>model.little1.Name) 
Html.HiddenFor(model=>model.little1.Name) 
Html.HiddenFor(model=>model.little1.Id) 
Html.HiddenFor(model=>model.little1.Location) 

y at-il une technique qui me permet de rendre à la fois des étiquettes et des éléments cachés automatiquement au lieu d'avoir à les faire chaque explicitement à chaque fois?

Quelque chose comme:

Html.RenderFor(model=>model.little1) 

Merci

Répondre

2

Créer un partial view qui est fortement typée au LittleThingViewModel.

LittleThingView.ascx (vue partielle)

Html.DisplayFor(model=>model.Name) 
Html.HiddenFor(model=>model.Name) 
Html.HiddenFor(model=>model.Id) 
Html.HiddenFor(model=>model.Location) 

Dans principale Voir

<% 
Html.RenderPartial("LittleThingView",model.little1); 
Html.RenderPartial("LittleThingView",model.little2); 
%> 

Pour faire paraître mieux vous pouvez faire une collection pour ces objets dans le grand ViewModel. Donc, si l'un d'entre eux est nul ou que vous en avez besoin de plus d'un, il ne nécessitera aucun changement.

public class BigThingViewModel 
{ 
    public List<LittleThingViewModel> littles=new List<LittleThingViewModel>(); 
    public string propA {get; set; } 
    public string propB {get; set; } 
    public string propC {get; set; } 
} 

Et dans la vue:

<% 
foreach(var littleThingViewModel in model.littles) 
{ 
    Html.RenderPartial("LittleThingView",littleThingViewModel); 
} 
%> 
+1

J'ai un modèle de vue similaire et je suis en utilisant une vue partielle de la rendre. C'est dans un formulaire cependant, et quand mon action POST est appelée sur submit, les propriétés dans mon équivalent de LittleThingViewModel ne sont pas remplies. Dois-je implémenter un classeur de modèle personnalisé pour cela? –

Questions connexes