2010-11-19 10 views
1

je creuse vraiment ce nouveau moteur ... Voir le rasoir pour quelqu'un venant d'une autre plate-forme web les nouveaux efforts MVC 3 commencent à se sentir à la maison pour moi ...Razor vue moteur RenderSection

Ma question est sur les sections, je vois qu'il est possible de définir des sections dans votre mise en page et d'y injecter du contenu mais de tous les échantillons que j'ai vu il semble que cela se fasse à partir de la vue. Pour moi, il est plus logique d'attribuer un contenu ou une sortie à chaque section du contrôleur. Donc, si j'ai une mise en page qui contient une barre latérale que je veux charger des widgets dans mon fichier d'affichage ne devrait pas être responsable du rendu du contenu dans ces sections. Si tel était le cas, si le contenu de la barre latérale était partagé entre plusieurs vues, je devrais dupliquer ce code dans les fichiers de vue. Mes fichiers de vue doivent ignorer le contenu affiché dans la barre latérale à côté d'eux.

Idéalement, je voudrais attribuer du contenu à mes sections dans la barre latérale de mon contrôleur de sorte que ma question, est-ce possible?

+2

Pourquoi cela serait-il plus logique de le faire depuis le contrôleur? Les contrôleurs ne sont généralement pas supposés avoir de logique de vue; ils sont juste responsables de choisir une vue et de lui donner un modèle. – Aaronaught

+0

pourquoi ne pas créer une vue partielle et l'utiliser dans les vues si nécessaire? Les contrôleurs – timothyclifford

+0

ont une logique de vue si vous y réfléchissez, ils initient le modèle de vue, lui affectent des valeurs dans certains cas, puis appellent la vue correspondante qui l'utilise. La même chose devrait être faite pour les sections. – JBeckton

Répondre

1

Dans ASP.NET MVC (et d'autres architectures d'application Web basées sur MVC), les contrôleurs préparent les données restituées par les vues. Comment, où et peut-être même quand ces données sont rendues au travail de la vue à comprendre. Ceci est bien sûr plus d'une discussion de conception architecturale. Une bonne chose à propos d'ASP.NET MVC est leur point de vue convention sur la configuration qui (surtout avec Razor) vous permet de changer le comportement de beaucoup de choses. Je ne pense pas qu'il existe une option View.Sections["section1"] = <some data>;, mais vous pouvez créer un ViewModel basé sur des sections, puis avoir une vue principale générique qui démonte ce ViewModel et envoie les données correctes pour corriger les vues partielles. Ce modèle de vue pour les sections pourrait même contenir du HTML qui doit être rendu, car Razor peut être utilisé pour rendre le HTML en dehors des fichiers .cshtml. Pour en savoir plus, allez sur le blog d'Andrew Nures: http://blog.andrewnurse.net/

Comme vous pouvez le voir, cela transfère beaucoup de responsabilités de la vue aux contrôleurs. J'ai moi-même aimé que le rendu soit totalement séparé des contrôleurs car alors je peux hypothétiquement construire des sites Web très différents en changeant simplement la façon dont les données sont rendues.

+0

J'utilise des modèles de vue et je suppose que je ne comprends pas comment utiliser une vue sur plusieurs actions tout en utilisant un modèle de vue. En fonction de ce que vous dites, je devrais soit copier le même code sur plusieurs pages d'affichage, soit utiliser la même page de vue pour plusieurs actions. Ou éventuellement copier le code à travers le modèle de vue pour chaque vue.Je n'achète pas l'idée que je devrais mettre du code à mon avis "peut-être logique de l'entreprise" qui décide ce qui est rendu où et quand pour une vue particulière. – JBeckton

+0

Si je voulais assigner des modules ou des widgets à produire dans des sections particulières sur une page où la détermination de ce qui rend dans quelle section est dans une table de données je ne traiterais pas ces décisions du code à mon avis. – JBeckton

+1

Il y a plusieurs façons de séparer la responsabilité d'une vue de son contenu. Le Html.Action (...) peut être utilisé pour obtenir le code d'une autre action rendue dans la vue courante. Vous devrez probablement encore faire une certaine logique minimale dans la vue qui indique cette action sur l'état de votre application. Mais, bien sûr, vous pouvez précalculer cela et simplement le ramener à des drapeaux. Mais comme je l'ai dit, essayez de regarder le blog d'Andrew Nurse sur l'utilisation de Razor en dehors d'ASP.NET et cela pourrait vous donner quelques idées. – gligoran

Questions connexes