2009-04-03 7 views
4

En raison de la confusion entre toutes les informations sur mvc de tous les aperçus et de la version officielle, je suis très confus sur la façon de traiter viewusercontrols. Alors une fois pour toutes, dites-moi comment implémenter cet exemple:ASP.Net MVC ViewUserControl avec le contrôleur utilisant MVC 1.0

J'ai une liste d'événements à venir qui doivent être affichés sur plusieurs pages de mon site web. Par conséquent, j'ai placé un nouveau ViewUserControl (ListEvents.ascx) dans mon dossier Views \ Shared.

Je demande ce ListEvents.ascx rendre sur ma maison/vue Index comme ceci:

<p> 
    Here's a list of events: 
    <% Html.RenderPartial("ListEvents");%> 
</p> 

Comment puis-je aller à passer mon modèle à ce ViewUserControl? Je sais que je peux le faire:

<p> 
    Here's a list of events: 
    <% Html.RenderPartial("ListEvents", (new Model.Services.EventService(null)).ListEvents());%> 
</p> 

Mais cela ne semble pas comme une chose très intelligente à faire, la création d'un nouveau modèle à l'intérieur d'une vue ?! Ou ai-je tort ici? Je ne peux même pas passer de validation, d'où le paramètre nul. Donc une option alternative est de stocker ces données dans le membre ViewData [], mais mon viewusercontrol n'est pas supposé être dépendant de la ViewData de son parent!

Je suis sûr qu'il y a une réponse très simple à cela, s'il vous plaît partager comme j'ai fini de naviguer sur le web pour ce problème.

Merci!

Réponse simple: Un viewusercontrol doit toujours recevoir son modèle de la vue dans laquelle il réside. Travailler autour de cela, comme en ajoutant un fichier codebehind à un viewusercontrol, casserait le modèle MVC.

Répondre

2

Par défaut, le même modèle que la page sera utilisé. Si vous souhaitez fournir un modèle à chaque instance de RenderPartial, votre situation est probablement similaire au rendu de plusieurs entrées dans une application de blog. Vous pouvez chercher chaque modèle d'une collection dans votre modèle de page et passer au contrôle de l'utilisateur comme ceci:.

foreach (var post in Model.Entries) { 
    Html.RenderPartial("PostTemplate", post); 
} 
+0

Oui mais mon modèle ViewUserControl dépend encore du modèle de la page, il réside dans Et c'est exactement ce que je veux éviter. – Peter

+0

Ils dépendent en fait d'une seule propriété de votre modèle, pas du modèle lui-même. Deux modèles complètement distincts peuvent avoir une même propriété. –

+0

Donc, chaque fois que j'ai besoin d'implémenter un viewusercontrol dans une vue, je dois m'assurer que le contrôleur de cette vue ajoute le modèle de la vue au modèle utilisé par viewusercontrol? – Peter

Questions connexes