2009-02-05 8 views
4

Sur ma page de démarrage, j'aimerais afficher les premiers éléments de plusieurs listes différentes que j'ai sur d'autres pages - un peu comme la page «récente» ici sur SO affiche les messages récents et les commentaires récents. Dans mon cas, je veux énumérer les deux messages les plus récents dans un livre d'or, et le prochain événement à venir.Est-il possible d'envoyer plusieurs objets de modèle à une vue ASP.NET MVC?

Pour ce faire, comment puis-je transmettre plusieurs objets Modèle à ma vue? Est-ce même possible? Si non, comment devrait-il être fait?

+0

ce poste est âgé de six ans et demi, et je me suis un downvote là-dessus aujourd'hui. Tout commentaire –

Répondre

11

Une alternative à la solution de tvanfosson est de créer une vue fortement typée afin d'obtenir une vérification du temps de compilation et moins de "chaînes magiques".

Exemple ...

Supposons que vous avez la classe:

public class FrontPageViewData 
{ 
    public List<Post> Posts { get; set; } 
    public List<Comment> Comments { get; set; } 
} 

Ensuite, dans votre contrôleur ...

public ActionResult Index() 
{ 
    FrontPageViewData viewData = new FrontPageViewData(); 
    viewData.Posts = DB.Posts.ToList(); 
    viewData.Comments = DB.Comments.ToList(); 
    return View(viewData); 
} 

Et, enfin ... à votre avis. Cela vous permettra d'accéder aux données passées avec intellisense si vous configurez la ligne d'enregistrement de la vue pour l'utiliser (notez la partie.) Cela signifie que la propriété Model sera une instance de l'argument passé dans viewdata dans la méthode VIew de votre contrôleur.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<FrontPageViewData>" %> 
<asp:Content ID="MainContent" ContentPlaceHolderID="MainContent" runat="server"> 
<%= Model.Posts.Count().ToString(); %> 
<%= Model.Comments.Count().ToString(); %> 
</asp:Content> 

Bien sûr, cela est juste une démo et je ne voudrais pas utiliser ce code verbatim.

+0

Si vous passez le modèle à un partiel, vous ne recevez pas de vérification à la compilation car le paramètre du modèle est de type object.Je n'aime pas nécessairement l'idée de créer une nouvelle classe tenir des données qui pourraient comme ea sily être dans un conteneur existant. Pourquoi ne pas écrire un ViewDataWrapper en tant qu'abstraction? – tvanfosson

+1

>> ... vous n'obtenez pas de vérification à la compilation car le paramètre du modèle est de type objet ... Vous avez une vérification à la compilation en spécifiant le paramètre de type pour ViewUserControl –

+0

Ceci serait certainement mon option préférée. Principalement car cela crée un niveau d'abstraction entre mon modèle de domaine et la vue. Ainsi je devrais pouvoir changer le modèle de domaine sans affection la vue ou vice versa. – pythonandchips