ASP.NET MVC: как отобразить частичное представление во всех представлениях, кроме одного?

У меня есть частичный вид/пользовательский элемент управления под названием LogOnUserControl, который я отображаю на боковой панели своего сайта (определено в Site.Master). У меня также есть отдельное представление LogOn, которое также отображает LogOnUserControl.

Мне не нужны два экземпляра LogOnUserControl в представлении LogOn, потому что это просто сбивает с толку, поэтому в настоящее время я думаю о включении такого условия, как

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

в Логонусерконтрол.

Это кажется неправильным, так как частичное представление теперь знает о представлении LogOn. Кроме того, я не могу найти, как получить имя представления, что усиливает ощущение, что я делаю что-то не так! :-)

Изменить. Еще одна сложность заключается в том, что одно и то же частичное представление используется как для представления входа в систему, так и для боковой панели в Site.Master.


person alastairs    schedule 24.04.2009    source источник


Ответы (3)


На главной странице оберните содержимое области боковой панели тегами области содержимого и присвойте ему идентификатор, например SideBarContentArea или что-то в этом роде. Это создает новую область контента, которую вы можете переопределить на страницах на основе мастера, и указывает контент по умолчанию, который будет отображаться, когда вы не реализуете его на дочерних страницах. Теперь на странице входа все, что вам нужно сделать, это переопределить SideBarContentArea и на этот раз не включать элемент управления входом.

Бада Бинг!

person Blake Taylor    schedule 25.04.2009
comment
Это решение решает проблему гораздо быстрее и проще, чем решение с вложенными мастер-страницами. - person alastairs; 26.04.2009

Рассматривали ли вы возможность использования другой главной страницы для входа в систему без частичной части входа на боковой панели? Если вас беспокоит дублирование html-разметки, вы можете использовать вложенные мастер-страницы, чтобы избежать этой проблемы.

person Steve Willcock    schedule 24.04.2009
comment
+1. Возьмите главную страницу и замените текущий вызов LogOnUserControl другим ContentPlaceHolder. Затем создайте две другие главные страницы, Main.master и Logon.master, вложенные в Site.master. Main.master добавит содержимое в новый ContentPlaceHolder, а Logon.master — нет. Проблема решена. - person Portman; 25.04.2009
comment
Я следил за комментарием Портмана (+1 за подробности! :-), но получаю сообщение об ошибке «Не могу найти ContentPlaceHolder 'MainContent' на главной странице '/Views/Shared/LogOn.Master'. Я установил представление LogOn для использования страницы LogOn.master. Отсутствующий ContentPlaceHolder находится в Site.Master, из которого вложен LogOn.Master... Что я делаю неправильно? - person alastairs; 26.04.2009
comment
Не беспокойтесь, я последовал ответу @BlakeTaylor ниже, который решил проблему. - person alastairs; 26.04.2009

Вы можете сохранить флаг в ViewData, чтобы указать это. Хотите ли вы ввести его строго или просто получить к нему прямой доступ, зависит от вас. Итак, на главной странице у вас может быть следующее:

<% if (ViewData["HideLogOnUserControl"] == "Y") { %>
    Insert HTML here
<% } else { %>
    Insert HTML here
<% } %>
person Kevin Pang    schedule 24.04.2009