2009-04-24 6 views
1

J'ai un contrôle de vue/utilisateur partiel appelé LogOnUserControl que je montre dans une barre latérale sur mon site (définie dans Site.Master). J'ai également une vue LogOn distincte, qui rend également le LogOnUserControl.ASP.NET MVC: comment afficher une vue partielle sur toutes les vues sauf une?

Je ne veux pas deux instances du LogOnUserControl dans la vue LogOn, parce qu'il est tout simplement déroutant, donc ma pensée actuelle est d'inclure une condition telle que

// Semi-pseudocode 
if (!Request.IsAuthenticated) && View.Name != "LogOn") 

dans le LogOnUserControl.

Ceci est incorrect, car la vue partielle connaît maintenant la vue LogOn. En outre, je ne peux pas trouver comment obtenir le nom de la vue, ce qui renforce le sentiment que je fais quelque chose de mal! :-)

Modifier: Il existe une autre complication: la même vue partielle est utilisée pour la vue LogOn et la barre latérale dans Site.Master.

Répondre

3

Sur la page principale Enroulez le contenu de la zone de barre latérale avec des balises de la zone de contenu et de lui donner un identifiant comme SideBarContentArea ou quelque chose. Ce que cela fait est de créer une nouvelle zone de contenu que vous pouvez choisir de remplacer sur les pages basées sur le maître et spécifie le contenu par défaut qui apparaîtra lorsque vous n'implémentez pas sur les pages enfants. Maintenant sur la page de connexion tout ce que vous avez à faire est de remplacer le SideBarContentArea et ne pas inclure le contrôle de connexion cette fois.

Bada Bing!

+1

Cette solution résout le problème beaucoup plus rapidement et facilement que celle impliquant des pages maîtres imbriquées. – alastairs

5

Avez-vous envisagé d'utiliser une page maître différente pour votre vue de connexion sans la connexion partielle dans la barre latérale? Si vous êtes préoccupé par la duplication du balisage html, vous pouvez utiliser des pages maîtres imbriquées pour éviter ce problème.

+1

+1. Prenez votre page maître et remplacez l'appel en cours à LogOnUserControl par un autre ContentPlaceHolder. Ensuite, créez deux autres pages maîtres, "Main.master" et "Logon.master" qui nichent à partir de "Site.master". Main.master ajoutera du contenu au nouveau ContentPlaceHolder, mais pas Logon.master. Problème résolu. – Portman

+0

J'ai suivi le commentaire de Portman (+1 pour le détail! :-) mais j'ai une erreur à propos de "Impossible de trouver ContentPlaceHolder 'MainContent' dans la page principale '/Views/Shared/LogOn.Master'". J'ai défini la vue LogOn pour utiliser la page LogOn.master. ContentPlaceHolder manquant est dans le Site.Master, dont LogOn.Master est imbriqué ... Que fais-je tort? – alastairs

+0

Ne pas s'inquiéter, j'ai suivi la réponse @ BlakeTaylor ci-dessous, qui a résolu le problème. – alastairs

2

Vous pouvez stocker un indicateur dans ViewData pour l'indiquer. Si vous voulez le taper fort ou simplement y accéder directement, c'est à vous de décider. Donc, sur votre page principale, vous pouvez avoir ceci:

<% if (ViewData["HideLogOnUserControl"] == "Y") { %> 
    Insert HTML here 
<% } else { %> 
    Insert HTML here 
<% } %> 
Questions connexes