Унаследованный веб-проект.NET 4.0 - атрибуты элементов управления и обработки ролей
Недавно я унаследовал большой.NET-проект, для которого необходимо установить ролевую реализацию. Разные роли имеют разный доступ к сайту, и некоторые элементы должны быть соответственно скрыты в зависимости от роли текущего пользователя.
Учитывая несколько гибкую и модульную архитектуру, это было достаточно легко реализовать, когда пользователи пытаются получить доступ к частям сайта, к которым у них нет доступа. Тем не менее, я столкнулся с проблемами при проверке видимости элементов управления.
Многие из элементов управления были реализованы через их собственные элементы управления, специфичные для проекта, однако ссылки в основном реализуются через HtmlAnchors, а некоторые другие поля, которые попадают в категорию с ограниченным доступом, также являются общими элементами HTML.
Есть ли способ, которым я могу исправить это с помощью универсального адаптера, или мне нужно порыться в огромном множестве элементов управления и элементов, присутствующих в проекте, и заставить их наследовать общую базу, где это может быть реализовано по отдельности? Ручной труд в этом случае будет означать большую работу, и я не совсем уверен, что в конце концов это даже правильный подход.
По сути, есть ли способ заставить все элементы управления и элементы страницы выполнять проверку, должны ли они отображаться или нет в веб-проекте.NET 4.0? И могу ли я каким-то образом исправить его, чтобы все элементы могли принимать и обрабатывать новый атрибут, который описывает их "уровень ограничения"?
1 ответ
Да, вы можете делать такие вещи. На ум приходят две функции ASP.NET, которые могут вам помочь:
ASP.NET Tag Mapping. Эта функция позволяет вам изменить тип объекта, который создается, когда анализатор находит определенный тег ASP.NET (так что вы можете, например, заменить все HtmlAnchors на SpecialHtmlAnchors, которые наследуются от некоторого базового класса по вашему выбору). Вам просто нужно добавить раздел tagMapping в /system.web/pages/ вашего web.config. (Я не тестировал этот образец, но он должен быть близок к правильному. В любом случае, это отправная точка.)
<system.web> <pages> <tagMapping> <add tagType="System.Web.UI.HtmlControls.HtmlAnchor, System.Web" mappedTagType="My.Special.HtmlAnchor, MyAssembly"/> </tagMapping> </pages> </system.web>
Адаптеры управления ASP.NET. Вы можете указать ASP.NET подключить выходной адаптер к каждому конкретному элементу управления определенного типа. Изначально эта функция предназначалась для облегчения адаптации вывода для определенных браузеров или типов браузеров (например, для настольных компьютеров и мобильных устройств), но вы можете делать с ними практически все, что захотите. Чтобы использовать их, вы создаете
.browsers
файл в вашемApp_Browsers
папку (если она не существует, щелкните правой кнопкой мыши свой веб-проект в VS, наведите курсор мыши на "Добавить папку ASP.NET" и выберите и выберите "App_Browsers". Затем добавьте свой.browsers
файл в эту папку с помощью диалога "Добавить новый элемент...". Зарегистрируйте свой собственный адаптер управления, изменив свой.browsers
файл должен выглядеть примерно так:<browsers> <browser refID="Default"> <!-- all browsers --> <controlAdapters> <adapter controlType="System.Web.UI.HtmlControls.HtmlAnchor" adapterType="My.Custom.RolesAwareControlAdapter, MyAssembly" /> </controlAdapters> </browser> </browsers>
Адаптеры управления наследуются от
System.Web.UI.Adapters.ControlAdapter
, который имеет почти все те же методы рендеринга, что и обычный элемент управления. ControlAdapter получает полный контроль над рендерингом для элемента управления, но может делегировать рендеринг обратно в целевой элемент управления, если он этого пожелает.
Что касается добавления новых атрибутов к вашим элементам управления: если вы уже собираетесь просматривать существующий код и добавлять атрибуты, почему бы просто не изменить тип тега, чтобы он ссылался на пользовательский элемент управления, пока он у вас? Открытые свойства пользовательских элементов управления автоматически повышаются до атрибутов разметки, чтобы вы могли указывать их значения во время разработки.
Еще один хороший подход к WebForms - хотя он и не исправит утомительное редактирование сотен страниц и пользовательских элементов управления - это использование LoginView, поскольку он предназначен для решения таких проблем, как ваша.
Дайте мне знать, если у вас есть какие-либо вопросы; Я буду рад уточнить.