2010-10-01 6 views
0

J'ai un ViewPage, Index.aspx. Dans ce document, je:ASP.NET MVC: Getting ViewModel en vue partielle sur ViewPage

<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx, new PromoViewModel()); %> 

Maintenant, le constructeur pour PromoViewModel a besoin d'un objet MemcachedCache que le contrôleur de l'indice utilise également.

Comment est-ce que je devrais passer ce MemcachedCache dans ma vue partielle?

Dois-je mettre l'instance MemcachedCache dans le ViewData et le faire?

<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx, 
    new PromoViewModel(ViewData["cache"] as MemcachedCache)); %> 

Index.aspx n'est pas une vue fortement typée; il n'utilise pas de modèle de vue. Mais dois-je le taper fortement avec un modèle de vue qui a un membre public Cache, puis y accéder via le Model?

<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx, 
    new PromoViewModel(Model.Cache); %> 

Maintenant, je trouve avec MVC3, il y a une troisième option: je peux mettre un membre ViewModel dans le contrôleur d'index avec le membre Cache, et l'utiliser comme ceci:

<%= Html.Partial("~/Index/ViewUserControl/Promo.ascx, 
    new PromoViewModel(ViewModel.Cache); %> 

Ce qui est plus approprié? Cela semble un peu confus/stupide pour moi.

Répondre

2

Personnellement, je l'ai dans le cadre de mon modèle qui est associé à la vue. Et charger cette propriété dans le contrôleur ... Donc je suppose que je dis plus sur le modèle de # 2 ci-dessus. Sauf que mon point de vue Modèle contiendrait l'instance « PromoViewModel »:

public class MainViewModel { 
    public string Prop1{get; set;} 

    public PromoViewModel Promo {get; set; } 
} 

public class MainController { 
    public ActionResult Hello() { 
     // Retrieve "cache" or whatever 
     var promoModel = new PromoViewModel(cache); 

     return new MainViewModel {Prop1 = "Hello", Promo = promoModel }; 
    } 
} 

Mon raisonnement est que le modèle de mon point de vue est juste que, son tous les trucs que je dois afficher sur ma page. Mon contrôleur est chargé de l'assembler, divers services faisant la plupart du travail, etc ...

+0

J'aime ça. C'est la direction que j'avais l'intention d'atteindre si je pouvais embarquer mes collègues. Merci pour le support de sauvegarde. :) – SnickersAreMyFave

+0

+1 pour la justification; Je préfère l'option deux pour cette raison moi-même. –

+0

+1 c'est comme ça que je le fais. Je veux ajouter que selon le scénario, vous pouvez faire des levages supplémentaires dans un filtre d'action. – eglasius

0

Je préférerais votre deuxième option pour MVC2, et la troisième si vous savez que vous utiliserez MVC3 lorsque l'application sera opérationnelle (et sont confiants que la fonctionnalité restera).

Les options que vous avez énumérées représentent une progression des fonctionnalités dans les versions MVC, fondamentalement.

Questions connexes