Отображение одного и того же контента для разных пользователей, которые могут видеть разные главные страницы (ASP.net)

У меня есть несколько страниц с содержанием, которое актуально как для пользователей, вошедших в систему, так и для пользователей, не вошедших в систему. Например, страницы с контактной информацией, политиками конфиденциальности и т. Д. Все страницы имеют типичное меню навигации, но пользователи, которые вошли в систему, обычно видят другую строку меню навигации, чем пользователи, не вошедшие в систему.

Как лучше всего это сделать в ASP.net?

Пока возможные решения включают следующее:

  1. Отображение содержимого во всплывающем окне. На странице не будет меню, это просто базовая страница, не требующая проверки, какой тип пользователя ее видит.
  2. Программное изменение главной страницы в зависимости от того, аутентифицирован пользователь или нет. Однако на одной из главных страниц есть некоторые переменные, к которым необходимо получить доступ, но не затрагиваемые пользователями, не вошедшими в систему.
  3. Помещение содержимого в пользовательский элемент управления и размещение этого пользовательского элемента управления на двух отдельных страницах для отображения соответствующему пользователю.

На самом деле я не фанат №1, потому что у пользователей, посещающих сайт впервые, может быть какой-то блокировщик всплывающих окон или отключен javascript.

Я знаю, что №2 возможен, если на странице будет использоваться какой-то базовый класс, унаследованный от MasterPage. Однако я читал, что это может быть не лучший дизайн, поскольку теперь одна из страниц имеет доступ к переменным, которые на самом деле не нужны.

Третий метод звучит разумно, но тогда будет два отдельных файла ASPX.

Есть ли правильный способ сделать это? Или другой метод, о котором я еще не подумал?

изменить

Чтобы уточнить, зарегистрированным пользователям необходимо установить определенные переменные на своих главных страницах, в то время как незарегистрированные пользователи этого не делают. Причина этого в том, что существует пользовательский элемент управления, который отображает специальное меню навигации, которое выделяет определенные элементы в зависимости от этих переменных.

Например, пользовательскому элементу управления требуется строка, чтобы определить, какой элемент выделить. Страница с информацией о профиле предоставит «профиль» в качестве параметра, который будет выделять пункт «Профиль» в меню.

Меню в пользовательском элементе управления создается динамически на основе данных из базы данных. Пункты меню сгруппированы по категориям и отображаются с соответствующим заголовком, который также извлекается из БД.


person Michael    schedule 19.07.2010    source источник


Ответы (1)


Программно изменить главную страницу легко; просто укажите правильный URL-адрес перед инициализацией, установите

protected override void OnPreInit(..)
{
    if (this.User != null) {
       if (this.User.Identity.IsAuthenticated)
            this.MasterPageFile = "~/loggedin.master";
       else
            this.MasterPageFile = "~/notloggedin.master";
    }
}

Для этого не нужен базовый класс.

Подход с пользовательским контролем тоже подойдет, но изменить файл главной страницы действительно легко.

РЕДАКТИРОВАТЬ: если у вас есть свойства, которые нужно установить или получить от мастера, вы можете использовать файл кода программной части, реализующий интерфейс, и проверить, относится ли ссылка this.Master к этому типу интерфейса.

HTH.

person Brian Mains    schedule 19.07.2010
comment
Я забыл указать, что зарегистрированным пользователям необходимо установить определенные переменные на главной странице (например, заголовок страницы и т. Д.), Тогда как незарегистрированные пользователи этого не делают. Я отредактировал свой вопрос. - person Michael; 19.07.2010
comment
Что ж, каждая мастер-страница определяет свой собственный набор параметров, или они являются общими для всего X-го количества мастер-страниц? - person Brian Mains; 19.07.2010
comment
В настоящее время у меня есть 3 мастер-страницы. Существует базовая мастер-страница с общим макетом. Также есть 2 вложенные мастер-страницы. Одна из этих вложенных страниц предназначена для пользователей, не вошедших в систему, и имеет строго макет. Другой предназначен для авторизованных пользователей и требует определенных параметров. Страницы, о которых я думаю, - это те, которые отображаются как для авторизованных, так и для незарегистрированных пользователей. Я действительно не хочу дублировать что-либо, если это возможно. Мне интересно, может ли метод №2 быть подходящим здесь. - person Michael; 19.07.2010
comment
Таким образом, вы можете переключать главную страницу в PreInit в зависимости от состояния входа в систему при условии, что конвейер устанавливает свойство User на странице в это время (не на 100% уверен), как в обновленном коде выше. - person Brian Mains; 19.07.2010