2009-03-08 5 views
2

Sur la page principale de mon site, je souhaite afficher plusieurs vues qui reposent sur leurs propres contrôleurs pour la récupération de données. Je ne veux rien récupérer de la DAL dans mon contrôleur Home.Rendu de plusieurs vues à partir de plusieurs contrôleurs sur une seule page

Par exemple, je veux afficher la vue liste top 5 nouvelles, une vue avec citation aléatoire de la base de données, une autre vue avec les utilisateurs Contenu du panier, etc.

Après googler autour, j'ai trouvé la méthode RenderAction qui est presque parfait, mais il n'est pas disponible en RC1, seulement en Futures, et apparemment, il a quelques problèmes.

Je trouve RenderPartial aussi bien, mais qui repose sur le contrôleur principal pour transmettre des données à la vue.

précisions supplémentaires:

La principale raison pour laquelle je ne veux pas la logique d'accès aux données dans le contrôleur Home est d'éviter de répéter le code et la logique. Je vais utiliser le top 5 des nouvelles vues dans plusieurs pages/contrôleurs. Je ne veux pas répéter la récupération de données dans chacun d'entre eux. J'ai déjà séparé beaucoup de logique et de validation en couche de gestion. La solution que je suis après est RenderAction ou UserControls comme dans ASP classique. Je sais que je peux les utiliser dans MVC, mais ... quel est le point? Je veux dire, si ce que je demande est trop compliqué ou trop absurde (composants d'interface utilisateur réutilisables), alors MVC n'est certainement pas pour moi, et je le considérerais sérieusement inférieur à ASP.NET classique, parce que cette exigence est vraiment simple.

Répondre

1

Qu'est-ce que vous demandez est d'accéder essentiellement pas effectuer de données dans le HomeController, cela semble une approche dogmatique. J'envisagerais soit d'utiliser RenderAction de l'assemblage Futures (je ne sais pas ce qui ne va pas, je l'utilise dans un certain nombre de projets) ou SubControllers de MvcContrib.

+0

Dogmatique? J'essaie simplement de ne pas répéter beaucoup de code ... – mitch

+0

Eh bien, il y a une solution de design derrière la vue. Essayez de créer une autre couche entre le contrôleur et DAL, peut-être un BLL. –

1

Je peux comprendre le désir de ne pas reproduire la fonctionnalité dans plusieurs contrôleurs, je ne comprends pas la réticence d'avoir votre contrôleur Home interagir avec le DAL. Je pense que la vue partielle est définitivement la voie à suivre. Ma solution pour ne pas répliquer la fonctionnalité serait de pousser le code qui génère les données pour les différentes vues dans votre entreprise ou votre couche de données. Vous pouvez ensuite le référencer à partir de chacune des actions de contrôleur requises qui utilisent les vues partielles. Le placer dans la couche de gestion pourrait isoler le contrôleur de votre couche de données, si c'est ce que vous désirez, mais je pense toujours que c'est le bon travail de l'action du contrôleur pour obtenir et fournir les données à la vue.

Une autre solution possible serait de remplir la vue générée par votre contrôleur Home via Ajax callbacks aux différentes actions du contrôleur qui génèrent les composants de vue nécessaires. L'inconvénient de ceci est qu'il ne manque pas gracieusement en l'absence de javascript dans le navigateur.

EDIT

Sur la base de ces précisions, je suggère la mise en œuvre d'un contrôleur de base qui remplit le ViewData pour les contrôles partagés dans ActionExecuted (pour que cela se fait que lorsque l'action réussit). Dérivez vos autres contrôleurs du contrôleur de base lorsque vous souhaitez hériter de ce comportement.

+0

Bien sûr, je vais remplir la collection ViewData avec la liste des dernières nouvelles, avec le profil de l'utilisateur, avec le panier ... et répéter que dans chaque page, dupliquer efficacement le code (peu importe la taille). – mitch

0

Si vous vraiment ne voulez pas utiliser RenderAction, la seule autre option que vous avez est de charger les morceaux de données nécessaires avec les filtres d'action.Votre contrôleur de la maison pourrait alors ressembler à ceci:

public class HomeController : Controller 
{ 
    [RequireNews] 
    [RequireQuotes] 
    [RequireCart] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Ces filtres d'action pourraient être réutilisés où ils sont nécessaires. Vous pouvez également choisir de les placer sur la classe de contrôleur elle-même.

+1

Je veux absolument utiliser RenderAction, mais si l'équipe se débarrasse de RC ... alors je me demande pourquoi? Je ne veux pas baser le code de production sur un concept Futures qui pourrait aussi disparaître ... – mitch

+0

Je ne m'inquiéterais pas de l'utiliser. Je l'utilise dans mes applications. Si cela disparaît dans le futur, vous pouvez vous tourner vers MvcContrib pour fournir un remplacement, car je sais que beaucoup de gens utilisent RenderAction. Je ne suis pas sûr de savoir pourquoi l'équipe l'a dans les futures, mais je peux demander ... –

+0

RenderAction est intrinsèquement dangereux car vous ne savez pas quel genre de résultat l'action va retourner, peut-être autre chose qu'une vue partielle . L'utilisation de filtres ou la mise en place d'un code de génération de données commun dans un contrôleur de base est un meilleur moyen de s'assurer que les données de vue sont disponibles pour les partiels. – tvanfosson

Questions connexes