asp.net Могу ли я заставить каждую страницу наследоваться от базовой страницы? Также должна ли некоторая часть этой логики быть на моей главной странице? - PullRequest
2 голосов
/ 14 января 2011

У меня есть веб-приложение с базовой страницей.

Каждая страница должна наследоваться от этой базовой страницы, поскольку она содержит свойства, которые им всем нужны, а также права входа в систему.

Моя базовая страница имеет некоторые свойства, например: IsRole1, IsRole2, currentUserID, Role1Allowed, Role2Allowed.

В начале каждой страницы я устанавливаю свойства "Role1Allowed" и "Role2Allowed"

 Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

    Role1Allowed = True
    Role2Allowed= False

End Sub

Затем базовая страница решает, нужно ли перенаправить пользователя.

'Пример кода, поэтому не совсем то, что будет, ошибка дает идею

 Protected Overridable Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
          If Role1Allowed And Not Role1 Then
'Redirect somewhere
          End If 
       End Sub

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

  Protected Overrides Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    MyBase.Page_Load(sender, e)
    If Not IsPostBack Then
        BindGrid()
    End If
End Sub

Другие свойства (IsRole1, IsRole, currentUserID) также доступны на странице, поэтому можно решить, нужно ли выполнять определенные действия в зависимости от пользователя.

(надеюсь, это имеет смысл)

Хорошо, у меня есть 2 вопроса

  1. Должна ли эта функциональность быть на базовой странице или как-то на главной странице, и если да, то как мне получить доступ ко всем свойствам, если бы она была?
  2. Поскольку над этим проектом работают несколько человек, и они создают страницы, некоторые из них забывают наследовать эту базовую страницу или вызывают базовую загрузку страницы при переопределении. Есть ли способ заставить их сделать это?

Ответы [ 4 ]

1 голос
/ 29 апреля 2011

Прочитав это, я нашел это: ссылка на изменения веб-конфигурации Должен быть идеальным для тебя.

1 голос
/ 14 января 2011
  1. Да, это должно быть на базовой странице.На мой взгляд, мастер-страница существует только для дизайнерских целей и представляет собой чисто визуальный макет.Конечно, некоторая часть этого макета может зависеть от разрешений, но сама по себе она не принимает решений, что полностью зависит от классов базовой страницы.Это дает дополнительное преимущество использования разных главных страниц без потери функциональности в ваших классах страниц.Что приятно.

  2. AFAIK, вам нужно вручную изменить базовый класс вашего класса code-behind.Чтобы выявить проблемы, когда разработчики не являются производными от соответствующего класса:

    • Скажите им обратить внимание (: P)
    • Напишите некоторый код, используя отражение, которое проверяет страницы в вашей сборке ивыбрасывает какой-то текст предупреждения, если он не является производным от правильного класса.Бонусные баллы, если имя разработчика может быть включено в этот вывод.
    • Что касается обеспечения вызова метода, вы можете установить какой-либо флаг, который устанавливается только в этом методе, и выбросить исключение дальше вниз поцепь рендеринга, если она не была установлена.
    • Еще лучше, убедитесь, что он вызывается независимо от того, что разработчик решил сделать.
0 голосов
/ 14 января 2011

Как сказал Му-Джус в своем ответе, вы не можете заставить определенный класс наследовать другой класс.

Однако, используя HttpModule, вы сможете получить текущий экземпляр Page, а затем просто проверитьего тип (в C # это if (!page is BaseClass)) должен сказать, наследуется ли он от базовой страницы или нет, и если нет, выдает какую-то ошибку.

0 голосов
/ 14 января 2011

Должна ли эта функциональность быть на базовой странице или как-то в мастере

Либо все в порядке, но у вас также есть та же проблема в любом случае - разработчики могут забыть наследовать от базовой страницы, а разработчики могут также забыть включить ссылку на главную страницу. Вы должны решить, что произойдет с меньшей вероятностью. Главные страницы также с большей вероятностью будут использоваться на незащищенных страницах, поскольку они содержат общий стиль и визуальные элементы сайта, поэтому, возможно, лучшим вариантом будет иметь «безопасную» базовую страницу.

быть в мастере, и если да, то как мне получить доступ ко всем свойствам, если бы это было?

Если вы встраиваете функциональность в мастер-страницу, вы можете получить доступ к общим свойствам мастера, используя Page.Master из кода за обычной страницей aspx.

Есть ли способ заставить их сделать это?

Кодовые отзывы. Или вы можете написать правило для инструмента статического анализа кода, такого как StyleCop, и запускать его каждый раз, когда кто-то регистрирует страницу в исходном репозитории.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...