1

Prenez l'exemple de vouloir avoir une barre latérale "Derniers articles" sur chaque page de votre site Web ASP.NET MVC. J'ai un NewsItemController qui convient aux pages consacrées à NewsItems. Qu'en est-il de la présence d'une barre latérale de news sur le HomeController pour la page d'accueil? Ou tout autre contrôleur d'ailleurs? Mon premier réflexe est de mettre la logique pour sélectionner les 5 premiers articles dans un contrôle utilisateur qui est ensuite appelé dans la page principale. De cette façon, chaque page reçoit une barre latérale de news sans avoir à contaminer les autres contrôleurs avec la logique NewsItem. Cela signifie alors mettre la logique dans ce que j'ai compris être la couche de présentation qui devrait normalement aller dans un contrôleur.Où appliquer la logique pour un contrôle de barre latérale dans ASP.NET MVC

Je peux penser à une demi-douzaine de façons différentes de l'aborder, mais aucune d'entre elles ne semble «juste» en termes de séparation des préoccupations et d'autres mots à la mode connexes.

+0

utilisez-vous des vues fortement typées? – jfar

Répondre

1

http://eduncan911.com/blog/html-renderaction-for-asp-net-mvc-1-0.aspx

Cela semble répondre à la question - même en utilisant l'exemple d'une barre latérale - mais en utilisant une fonction non inclus avec MVC 1 par défaut.

http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx

Cela indique aussi la réponse réside dans RenderAction.

Pour les autres intéressés, voici comment j'ai fini par le faire. Notez que vous aurez besoin de l'assemblage MVC Futures pour RenderAction.

Fondamentalement, vous auriez quelque chose comme ça dans votre contrôleur:

public class PostController 
{ 

//... 

    public ActionResult SidebarBox() 
    { 
     // I use a repository pattern to get records 
     // Just replace it with whatever you use 
     return View(repoArticles.GetAllArticles().Take(5).ToList()); 
    } 

//... 

} 

Ensuite, créez une vue partielle pour SidebarBox avec le contenu que vous voulez afficher, et votre maître (ou partout où vous voulez afficher) vous utiliseriez:

<% Html.RenderAction<PostController>(c => c.SidebarBox()); %> 

Pas si difficile après tout.

1

Je pense que vous devriez envisager de le mettre dans votre page maître. Votre contrôleur peut rassembler des données (de manière asynchrone, bien sûr), les stocker dans une belle propriété ViewModel pour votre vue (ou dans TempData) et ensuite vous pouvez appeler RenderPartial() dans votre page maître pour rendre les données.

Le garde tout « séparé »

+3

RenderPartial n'offre pas le genre de séparation que je recherchais. RenderAction fait le travail cependant. J'ai mis à jour le message original avec un exemple de réponse en conséquence. – nathanchere

+1

Tant que vous pouvez vous permettre les passes multiples à travers le cycle "action", c'est aussi un moyen valable. –

1
  1. Vous pouvez créer un contrôle utilisateur (.ascx), puis appeler RenderPartial().
  2. Concevez une méthode dans votre contrôleur avec JsonResult comme type de retour. Utilisez-le avec jQuery.
  3. Utilisez RenderAction() comme suggéré par ailleurs.

News section with ASP.NET MVC

Questions connexes