ASP.Net은 실제로 스킨 변경인 테마 스킨을 제공합니다. 그런데 인터넷상에서 이런 것은 .aspx 페이지에서는 사용할 수 있지만 마스터 페이지(MasterPage)에서는 사용할 수 없다고 하는 것이 쓸모없다고 말하는 사람들이 많습니다. 예, Page.Theme 속성이 PreInit(){}에 설정되어 있기 때문에 MasterPage에서 DDL 선택을 통해 전체 웹사이트의 테마를 직접 전환할 수 없다는 것은 사실입니다. 그렇지 않으면 오류가 보고되고 MasterPage가 실행되지 않습니다. 사전 초기화().
이 예가 모든 사람이 이 문제를 해결하는 데 도움이 되기를 바랍니다. 모두가 내 소스코드를 더 잘 이해할 수 있도록 아래에 간략하게 소개하겠습니다.
먼저 아이디어에 대해 이야기해 보겠습니다. 우리의 목적은 DropDownList를 전환하여 MasterPage에 DropDownList를 넣는 것입니다. 여기서는 DropDownList를 사용하지 않지만 Css를 사용하여 LinkButton이 각 항목에 배치되는 "DropDownList"를 시뮬레이션합니다. 각 LinkButtond PostBackUrl의 값은 "~/ThemeTool.aspx?Theme=theme name" 형식으로 되어 있으며 Discuz!처럼 현재 페이지만 변경하는 것이 아니라 전체 웹사이트의 테마를 변경합니다. 이 변경 사항은 전역적이지만 현재 스레드에 대한 것입니다. 즉, 사용자 A가 테마를 변경합니다. 이는 사용자 A에게만 유효하고 사용자 B에는 영향을 미치지 않으므로 구성 파일을 건드리지 않습니다. 예, Session["Theme"]="Blue"와 같이 세션에 테마 이름을 입력해야 합니다. 각 페이지는 세션 값만 가져오면 됩니다. Page_PreInit()를 페이지의 Page.Theme 속성에 할당하면 괜찮습니다.
"DropDowList" 옵션을 변경할 때 실제로 다른 Link버튼을 클릭합니다. 이는 테마 이름 변경을 의미하며, 이는 Session["Theme"] 값 변경을 의미합니다. 이 "변경"을 실행할 위치는 어디입니까? 이것은 매우 중요합니다. LinkButton_Click()에 있습니까? 아니요, Page.Theme을 다시 가져오는 것은 Page_PreInit()에 있어야 하고 LinkButton_Click()은 PreInit()는 말할 것도 없고 로드 후 매우 늦게 발생하므로 여기에서 .aspx로 처리된 ThemeTool로 이동한 다음 원본 페이지로 리디렉션됩니다. 처리 후 원본 페이지의 PreInit() 이전에 Session["Theme"] 값이 변경되도록 이 프로세스로 인해 ThemeTool이 브라우저에 로드되지는 않습니다. 방금 Page_PreInit()을 빌려서 사용한 후 바로 떠났습니다. 하하! !
좋아요, 그게 아이디어입니다. 다음 세 개의 파일을 소개하겠습니다.
1. MasterPage.master, 이 파일에서 언급할 가치가 있는 것은 CSS로 시뮬레이션된 "DropDownList"입니다. "DropDownList"의 각 항목에는 LinkButton이 있고 각 LinkButtond의 PostBackUrl 값은 " ~/ThemeTool. aspx?Theme=테마 이름"이므로 "DropDownList" 옵션이 변경될 때마다 새 테마 값이 ThemeTool.aspx에 전달되고 ThemeTool.aspx는 새 테마 값을 처리하여 세션에 저장합니다. .
2. App_Code 폴더에는 GetTheme(페이지 P) 및 GetTheme(페이지 P)라는 두 가지 정적 메서드가 포함된 ThemeSkin.cs 파일이 있습니다. GetTheme(페이지 P)는 테마를 가져오는 데 사용됩니다. 테마가 필요한 모든 페이지의 Page_PreInit()에서 호출됩니다(여기서는 Default.aspx 및 Default2.aspx l입니다). 매개변수 P는 페이지 유형 개체인 메서드를 호출하는 페이지를 나타냅니다. ChangeTheme()은 ThemeTool.aspx.cs의 Page_PreInit()에서 호출되는 테마 전환에 사용됩니다.
3. 루트 디렉토리에 있는 ThemeTool.aspx 페이지도 매우 중요합니다. 테마 전환은 Page_PreInit에서 수행됩니다. 누가 MasterPage에 PreInit을 실행하지 말라고 지시했습니까? 내부 코드는 매우 간단합니다. 제 말을 믿을 수 없다면 한번 살펴보세요.
확장하다