ASP.Net предоставляет темы оформления, которые на самом деле представляют собой изменения оформления. Однако многие в Интернете говорят, что эта штука бесполезна, говоря, что эту штуку можно использовать в страницах .aspx, но нельзя использовать в главных страницах (MasterPage). Да, это правда, что вы не можете напрямую переключать тему всего веб-сайта через выбор DDL в MasterPage, поскольку свойство Page.Theme установлено в PreInit(){}, в противном случае будет сообщено об ошибке, и MasterPage не будет выполнен. Преинит().
Я надеюсь, что этот пример поможет каждому решить эту проблему. Чтобы каждый мог лучше понять мой исходный код, я кратко представлю его ниже.
Сначала давайте поговорим об идее: наша цель — поместить DropDownList в MasterPage, переключив DropDownList (здесь я не использую DropDownList, а использую Css для имитации «DropDownList», в котором LinkButton размещается в каждом элементе, и каждый LinkButtond Значение PostBackUrl имеет форму: «~/ThemeTool.aspx?Theme=имя темы» ), чтобы изменить тему всего веб-сайта, а не просто изменить текущую страницу, как в Discuz!, поэтому это изменение глобальное, но оно для текущего потока, то есть пользователь А меняет тему, которая действительна только для пользователя А и не влияет на пользователя Б, поэтому файл конфигурации трогать не будем. Дальше что будем. быстро подумайте о сеансе. Да, нам нужно поместить имя темы в сеанс, например Session["Theme"]="Blue"; таким образом, каждой странице нужно только получить значение сеанса. Page_PreInit() и присвойте его атрибуту Page.Theme страницы, и все будет в порядке.
Когда мы меняем опцию «DropDowList», здесь я на самом деле нажимаю на другую кнопку «Ссылка», что означает изменение имени темы, что означает изменение значения Session[«Theme»] Это «изменение» Где его выполнить? Это очень важно. Это в LinkButton_Click()? Нет, поскольку повторное получение Page.Theme должно происходить в Page_PreInit(), а LinkButton_Click() происходит очень поздно, после загрузки, не говоря уже о PreInit(), поэтому я перехожу к ThemeTool здесь, обработанному в .aspx, а затем перенаправляюсь на исходную страницу. после обработки, чтобы значение Session["Theme"] было изменено до PreInit() исходной страницы. Будьте уверены, что этот процесс не приведет к загрузке ThemeTool в браузер. То, что мы не видим, мы. просто позаимствовал Page_PreInit() и ушел сразу после его использования, хаха! !
Хорошо, это идея, давайте представим следующие три файла:
1. MasterPage.master, в этом файле стоит упомянуть мой «DropDownList», смоделированный с помощью CSS. Каждый элемент «DropDownList» имеет LinkButton, а значение PostBackUrl каждого LinkButtond имеет форму: « ~/ThemeTool. aspx?Theme=Имя темы", так что каждый раз при изменении параметра DropDownList новое значение темы будет передаваться в ThemeTool.aspx, а затем ThemeTool.aspx будет обрабатывать новое значение темы и сохранять его в сеансе. .
2. В папке App_Code находится файл ThemeSkin.cs, который содержит два статических метода: GetTheme(Page P) и GetTheme(Page P). Этот метод используется для получения темы. Он вызывается в Page_PreInit() каждой страницы, которая должна иметь тему (я здесь Default.aspx и Default2.aspx l). Параметр P относится к странице, которая вызывает метод, который является объектом типа Page. ChangeTheme() используется для переключения темы, вызываемой в Page_PreInit() файла ThemeTool.aspx.cs.
3. Страница ThemeTool.aspx в корневом каталоге также очень важна. Переключение темы осуществляется в ее Page_PreInit. Кто сказал MasterPage не выполнять PreInit? Код внутри очень простой. Если вы мне не верите, взгляните.
Расширять