이전 게시물은 WCF와 함께 Magento의 API를 사용하는 방법을 다루었습니다. 내가 겪은 Magento의 또 다른 측면은 테마에 대한 매우 유연한 지원이라는 것입니다.
기본 테마와 근본적으로 다른 새로운 테마를 디자인 할 수 있습니다. 계단식 스타일 시트에서 이미지와 색상을 변경할 수있을뿐만 아니라 페이지를 구성하는 지역 (헤더, 콘텐츠, 바닥 글 ...)을 재정의 할 수도 있습니다. 지역마다 어떤 HTML이 주사되는지 지정할 수 있습니다. 이를 통해 사이트 테마를위한 최대의 사용자 정의 파워를 제공합니다.
ASP.NET의 테마는 기본적으로 지원됩니다. APP_Themes 폴더를 사용하면 사이트의 모양과 느낌을 사용자 정의 할 수 있지만이 시스템은 성가신 일 수 있습니다.
Magento는 ASP.NET MVC 프레임 워크와 마찬가지로 MVC 패턴을 사용하여 구축되었습니다. 이것이 바로이 기사의 초점입니다. ASP.NET MVC에서 테마를 구현하려면 어떻게해야합니까?
시작하자 ...
코딩을 시작하기 전에 우리가 달성하고자하는 목표를 요약하겠습니다. 우리가 중국, 베트남, 사우스 코레아에서 만든 가구를 수입하는 회사를 소유하고 있다고 가정 해 봅시다. 우리는 최종 사용자에게 직접 판매하지 않고 리셀러에게 판매합니다.
모든 리셀러가 전자 상거래 사이트로 사용할 수있는 ASP.NET MVC 전원 웹 응용 프로그램을 설계하려고합니다. 각 리셀러는 자신의 도메인 이름을 가지고 있으며 온라인으로 상품을 판매하려고합니다. 이러한 각 도메인은 단일 웹 응용 프로그램에 연결되어 있습니다.
웹 응용 프로그램에서 제공하는 기능은 각 리셀러마다 동일하지만 각 리셀러는 사용자 정의 테마를 적용하여 온라인 상점을 사용자 정의하려고합니다. 우리는 다음과 같은 상황을 지원할 것입니다.
따라서 스타일 시트 (CSS), 마스터 페이지, 뷰 및 부분보기를 동적으로 교체 할 수있는 방법을 알아 내야합니다.
시작하기 전에 토대를 마련해야합니다. 간단한 데모 애플리케이션을위한 기본 사항을 구성하여 시작하겠습니다.
비고 :이 섹션에서는 테마 기능을 시연 할 수 있도록 데모 애플리케이션 설정에 대한 빠른 개요를 제공합니다. 이것은 빠르고 쉬운 접근 방식입니다. 이 기사의 초점은 도메인 모델을 설계하고 비즈니스 로직 계층을 설계하는 방법에 대한 것이 아닙니다. 그래서 나는 이것을 가능한 한 짧게 유지합니다. 자유롭게 개선하십시오.
데이터 베이스
SQL Server Express (2005 또는 2008)를 사용하여 새 데이터베이스를 만듭니다. Northwind 데이터베이스에서 영감을 얻은 I Database [Winddirection]을 지명했습니다.
이 데이터베이스에는 [리셀러]라는 정확히 하나의 테이블이 포함되어 있습니다. 다음 그림과 같이 테이블을 설계하십시오.
그림 1- [리셀러] 테이블
![리셀러 테이블 [Reseller] Table Design](https://images.downcodes.com/uploads/20250616/img_68500176a3ae030.png)
보시다시피 ID 열은 기본 키이며 ID 사양 (= AutoinCrement)을 사용합니다. 또한 각 리셀러에는 고유 한 도메인이 있으므로 도메인 열에 고유 한 제약 조건을 추가하십시오.
비고 :이 기사와 함께 제공되는 소스 코드에는 손으로 디자인하지 않으려면이 테이블을 신속하게 생성 할 수있는 스크립트 (DDL.SQL)가 포함되어 있습니다.
데이터베이스 설정의 마지막 부분은 [리셀러] 테이블에 대한 더미 레코드를 입력하는 것입니다. 다음 기록을 입력하십시오.
그림 2- 리셀러

우리는 4 명의 리셀러가 있습니다. 첫 번째 리셀러는 사용자 정의 테마가 없으며 기본 테마로 돌아갑니다. 다른 모든 사람들은 고유 한 사용자 정의 테마가 정의되어 있습니다.
Visual Studio 2008을 시작하고 "mvcapplication"이라는 새로운 빈 솔루션을 만듭니다. 새 코드 라이브러리를 추가하고 "Cgeers.windDirection.Database"라고 부릅니다. 자동으로 생성 된 class1.css 파일을 삭제하십시오.
다음으로 새 LINQ에 SQL 클래스 항목을 추가하고 "Dataclasses"이름을 지정하십시오. 새 DataconText의 이름을 "WindDirectionDataconText"로 바꿉니다. 이제 [리셀러] 테이블을 서버 탐색기 탭에서 LINQ에서 SQL 디자이너 표면으로 드래그하십시오.
그림 3- 리셀러 엔티티

DataContext의 연결 속성을 "None"으로 설정하고 연결 문자열 응용 프로그램 설정 및 응용 프로그램 구성 파일 (App.Config)을 삭제하십시오. 나는 Visual Studio가 나에게 연결 문자열을 주입한다는 사실을 좋아하지 않습니다. 나는 그것을 직접하고 싶다.
그렇기 때문에이 어셈블리에 다음 부분 클래스를 추가하여 연결 문자열로 데이터 컨텍스트를 초기화하는 것을 처리합니다. 우리가 동의해야 할 유일한 부분은 연결 문자열의 이름이 "바람 방향"이라는 것입니다.
Listing 1- WinddirectionDataconText 클래스
public partial class WindDirectionDataContext
{
private static readonly string ConnectionString ;
static WindDirectionDataContext ( )
{
ConnectionStringSettings settings = ConfigurationManager . ConnectionStrings [ "WindDirection" ] ;
ConnectionString = settings != null ? settings . ConnectionString : String . Empty ;
}
public WindDirectionDataContext ( ) : base ( ConnectionString ) { }
}System.configuration Assembly에 대한 참조를 추가하는 것을 잊지 마십시오. 이 어셈블리를 참조하는 응용 프로그램에 "Winddirection"이라는 연결 문자열을 포함 시키면 잘 작동합니다.
우리는 거의 거기에 있습니다. 그냥 붙잡 으십시오. 이제 "cgeers.windDirection.Managers"라는 솔루션에 새 코드 라이브러리를 추가하십시오. 자동으로 생성 된 class1.cs 파일을 삭제하고 system.data.linq 어셈블리에 대한 참조를 추가하십시오.
관리자라는 새 클래스를 추가하고 다음 코드를 추가하십시오.
Listing 2- 초록 관리자
public abstract class Manager
{
protected Manager ( )
{
Context = new WindDirectionDataContext ( ) ;
}
public WindDirectionDataContext Context { get ; set ; }
}이 매우 간단한 클래스는 나중에 LINQ 쿼리를 방출 할 수있는 새로운 DataContext를 만듭니다.
다음으로 프로젝트에 "ResellerManager"라는 클래스를 추가하고 Listing 3에 표시된 코드를 추가하십시오.
목록 3 리셀러 관리자
public class ResellerManager : Manager
{
public string GetThemeForDomain ( string domain )
{
var q = from r in Context . Resellers
where r . Domain == domain
select r . Theme ;
string theme = q . SingleOrDefault ( ) ;
return ! String . IsNullOrEmpty ( theme ) ? theme : "Default" ;
}
}이 관리자 수업은 추상 관리자 클래스에서 내려 가서 getTheMefordomain (...)이라는 하나의 메소드를 추가합니다. 이 메소드는 주어진 도메인 이름을 기반으로 리셀러의 테마를 찾습니다. 각 도메인이 하나의 리셀러에 고유하게 묶여 있기 때문에 이것은 아무런 문제가 없습니다.
Voila, 이것이 데모 응용 프로그램에 필요한 모든 데이터 액세스입니다. 우리는 들어오는 요청의 영역을 기반으로 리셀러의 테마를 파악하고이를 적용해야합니다.
비고 : ASP.NET 전원 응용 프로그램에서 LINQ에서 SQL 컨텍스트를 사용하는 것을 조심하십시오. 이 기사에서는 입증되지는 않았지만 우리의 주요 노력에서 너무 많이 산만 해지 기 때문에 요청 당 하나의 컨텍스트 만 작성하는 것이 좋습니다. 요청 중에 항상 액세스 할 수 있도록 요청의 httpcontext에 컨텍스트를 저장하십시오.
얼마 전 나는 이것에 관한 기사를 썼다. 여기에서 엔티티 프레임 워크 ObjectContext 기사를 확인하십시오. LINQ에서 SQL 대신 엔티티 프레임 워크를 다루지 만 여전히 적용 가능합니다.
기본 데모 응용 프로그램을 완료하는 마지막 단계는 솔루션에 새로운 웹 사이트 프로젝트를 추가하는 것입니다. ASP.NET MVC 웹 애플리케이션 프로젝트 템플릿을 기반으로 솔루션에 새 프로젝트를 추가하고 "MVCapplication"으로 지정하십시오. 이 애플리케이션에 대한 단위 테스트 프로젝트를 만들고 싶은지 묻습니다. 이 기사에 필요하지 않으므로이 건너 뛰기 위해 "아니오"를 선택하십시오.
Visual Studio는 "Hello, World!"-여러 기본 페이지 (Home, About, Log On ... 등)가 포함 된 ASP.NET MVC 응용 프로그램을 생성합니다. 연결 문자열을 web.config 파일에 추가하고 cgeers.winddirection.database 및 cgeers.windDirection.managers 어셈블리에 참조를 추가하십시오.
비고 : web.config에는 ASP.NET 멤버십, 프로필, 역할 ... 공급자를 나타내는 여러 구성 설정이 포함되어 있습니다. 필요하지 않으므로 계속 삭제할 수 있습니다.
솔루션 탐색기는 그림 4와 유사해야합니다.
그림 4- 솔루션 탐색기

비고 :이 기사를 작성할 때 ASP.NET MVC 버전 1.0을 사용하고 있습니다. 그러나 버전 2.0은 가까운 시일 내에 출시 될 예정입니다.
웹 응용 프로그램을 실행할 때 가장 먼저 알아야 할 것은 적용 해야하는 테마입니다. 이것은 모든 요청마다 수행되어야합니다. 따라서 요청 파이프 라인에 사용자 정의 HTTP 모듈을 연결하는 것이 적절 해 보입니다.
MVCapplication 프로젝트에 새 클래스를 추가하고 ThemeHttpModule이라고 부릅니다. 클래스가 ihttpmodule 인터페이스를 구현하도록하십시오. 이 클래스의 전체 코드는 Listing 4에 나와 있습니다.
이 기사는 HTTP 모듈 작성에 대한 입문서가 아니므로 자세한 정보가 필요한 경우 MSDN에서 "연습 : 사용자 정의 HTTP 모듈 작성 및 등록"기사를 확인하십시오.
Listing 4- ThemehttpModule
public class ThemeHttpModule : IHttpModule
{
public void Init ( HttpApplication application )
{
application . BeginRequest += application_BeginRequest ;
}
private void application_BeginRequest ( object sender , EventArgs e )
{
HttpApplication application = ( HttpApplication ) sender ;
HttpContext context = application . Context ;
if ( context . Cache == null )
{
return ;
}
string domain = context . Request . Url . GetDomain ( ) ;
string cacheKey = String . Format ( CultureInfo . InvariantCulture , "theme_for_{0}" , domain ) ;
if ( context . Cache [ cacheKey ] == null )
{
ResellerManager manager = new ResellerManager ( ) ;
string theme = manager . GetThemeForDomain ( domain ) ;
context . Cache [ cacheKey ] = theme ;
}
}
public void Dispose ( ) { }
}이 HTTP 모듈은 BeginRequest 이벤트에 대한 이벤트 핸들러를 추가합니다. 이 이벤트는 ASP.NET이 요청에 응답 할 때 HTTP 파이프 라인 실행 체인에서 첫 번째 이벤트로 발생합니다.
여기서 우리는 들어오는 요청에서 도메인 이름을 추출합니다. 다음으로 리셀러 매너의 getthemefordomain (...) 메소드를 사용 하여이 도메인의 테마를 검색합니다. 그런 다음 결과가 캐시됩니다. 다음 에이 도메인에 대한 요청이 트리거되면 캐시에서 테마가 검색되고 데이터베이스 쿼리가 발생하지 않습니다.
getDomain () 메소드는 URI 클래스의 확장 메소드입니다. 이 기사의 소스 코드를 확인하여 작동 방식을 확인하십시오. 비슷한 방식으로 요청에서 하위 도메인 (예 : www, admin ... 등)을 추출하도록 선택할 수 있습니다. 그런 다음 테마 엔진을 확장하여 도메인의 각 하위 도메인마다 다른 테마를 적용 할 수 있습니다.
마지막으로 web.config 파일에서 항목을 작성하여 테마 httpmodule을 등록하십시오. 이는 HTTP 모듈을 요청 파이프 라인 알림에 가입하기 위해 필요합니다.
Listing 5- ThemeHttpModule 등록
< httpModules >
< add name = " ThemeHttpModule " type = " MvcApplication.ThemeHttpModule " />
<!-- ... -->
</ httpModules >웹 애플리케이션을 시작하면 그림 5에 표시된대로 기본 모양 및 느낌을 받게됩니다. Visual Studio는 마스터 페이지 및 스타일 시트를 포함한 일부 기본 페이지 (홈, 약, 로그온 등)를 생성합니다. 이 파일을 사용하여 기본 테마를 구성하겠습니다.
그림 5 -ASP.NET MVC 응용 프로그램 기본 테마

기본적으로 모든 파일은 컨텐츠 및 뷰 폴더에 저장됩니다. 우리는 논리적으로 테마를 그룹화 할 수 있도록 자체 디렉토리 구조를 구현해야합니다. 따라서 테마라는 새 폴더를 만듭니다. 테마 디렉토리의 하위 폴더를 작성하고 기본값을 호출하십시오. 이 기본 디렉토리에서 컨텐츠 및 뷰 디렉토리를 이동하십시오.
컨텐츠 및 뷰 폴더를 이동 한 후 각보기에 대한 페이지 지시의 MasterPageFile 속성을 조정해야합니다! 이전 값은 더 이상 존재하지 않는 위치를 참조합니다. MasterPageFile = "~/views/shared/ site.mas
그림 6- 기본 테마

Voila, 우리의 기본 테마가 설정되었습니다. 새 테마를 만들려면 새 폴더 만 만들어 테마 폴더 아래에 배치하면됩니다. 이전 스크린 샷에서 볼 수 있듯이 나중에 다른 테마 (녹색, 주황색, 빨간색)를 만들 것입니다.
방금 마스터 페이지, 스타일 시트,보기 등을 옮겼습니다. 다른 디렉토리로. 웹 애플리케이션을 시작하면 이제 다음과 같은 예외가 제공됩니다.
그림 7- InvalidoPerationException

보기 '인덱스'또는 마스터를 찾을 수 없었습니다. 다음 위치를 검색했습니다.
MVC는 기본 시작 페이지에 대한보기를 찾으려고하지만 검색하는 기본 위치에서는 찾을 수 없으므로 예외를받습니다. 이 파일을 기본 테마 폴더로 옮겼으며 곧 다른 테마를 만들 것입니다. 우리는 MVC에 뷰, 마스터 페이지, 부분보기 등을 검색 할 위치에 대해 알리는 방법이 필요합니다. 이 위치는 리셀러의 주제에 따라 다릅니다.
따라서 기본적으로 ASP.NET MVC의 테마를 지원하기 위해해야 할 일은 다음과 같습니다.
이를 위해서는 자체 뷰 엔진을 작성해야합니다. MVC는 뷰 엔진을 사용하여 응답을 위해 페이지를 렌더링합니다. 이보기 엔진은 마스터 페이지, 뷰 및 부분 뷰를 찾는 역할을합니다. 기본적으로 WebFormViewEngine이 사용됩니다.
이 기본보기 엔진을 자체적으로 교체해야합니다. 이를 위해 MVCapplication 프로젝트에 ThemedViewEngine이라는 새로운 클래스를 추가하여 WebFormViewEngine 클래스에서 내려갑니다.
Listing 6- ThemedViewEngine
public class ThemedViewEngine : WebFormViewEngine
{
#region Constructor(s)
// Replace the default search paths by our own.
public ThemedViewEngine ( )
{
// Search paths for the master pages
base . MasterLocationFormats = new [ ]
{
"~/Themes/{2}/Views/{1}/{0}.master" ,
"~/Themes/{2}/Views/Shared/{0}.master"
} ;
// Search paths for the views
base . ViewLocationFormats = new [ ]
{
"~/Themes/{2}/Views/{1}/{0}.aspx" ,
"~/Themes/{2}/Views/{1}/{0}.ascx" ,
"~/Themes/{2}/Views/Shared/{0}.aspx" ,
"~/Themes/{2}/Views/Shared/{0}.ascx" ,
} ;
// Search parts for the partial views
// The search parts for the partial views are the same as the regular views
base . PartialViewLocationFormats = base . ViewLocationFormats ;
}
#endregion
}이 새로운 뷰 엔진의 생성자에서 우리는 Mas
각 경로에는 동적으로 결정된 3 개의 부품이 포함되어 있습니다.
새로운 뷰 엔진을 사용하려면 등록해야합니다. Global.asax.cs 파일에있는 Application_Start 이벤트 핸들러에 다음 코드를 추가하여이를 수행하십시오.
목록 7- 테마 뷰 엔진을 등록하십시오
protected void Application_Start ( )
{
ViewEngines . Engines . Clear ( ) ;
ViewEngines . Engines . Add ( new ThemedViewEngine ( ) ) ;
RegisterRoutes ( RouteTable . Routes ) ;
}여기서는 이전에로드 된 뷰 엔진을 지우고 직접 주입합니다. 이제 남아있는 모든 것은 뷰 엔진에 새 검색 경로를 포맷하여 요청 된 파일을 올바르게 찾을 수 있도록하는 방법을 지시하는 것입니다. 이렇게하려면 다음 두 가지 방법을 무시해야합니다.
Listing 8 -FindPartialView (...) 및 FindView (...) 메소드
public override ViewEngineResult FindPartialView ( ControllerContext controllerContext , string partialViewName , bool useCache )
public override ViewEngineResult FindView ( ControllerContext controllerContext , string viewName , string masterName , bool useCache )이 두 기능에 대한 코드는 여기에 포함되지 않을 것입니다. 매우 길고 개인 도우미 방법에 대한 몇 가지 참조가 있기 때문입니다. 기본적 으로이 두 가지 방법은 동일한 패턴을 따릅니다.
따라서 새로운보기 엔진은 기본적으로 테마 폴더를 검색하고 요청 된 마스터 페이지,보기 또는 부분보기를 찾을 수없는 경우 기본 테마의 것과 사용합니다. 물론 기본 테마는 완료되어야하며 누락 된 파일이 없어야합니다.
이를 통해 마스터 페이지 만 포함하는 테마를 만들 수 있습니다. 마스터 페이지 만 포함하여 다른 스타일 시트 또는 다른 스타일을 다르게 스타일링하려는 섹션에 대한보기 및 / 또는 부분보기가 포함 된 테마를 참조 할 수 있습니다.
이 패턴을 따르면 특정 뷰를 무시하고 사용자 지정보기가 제공되지 않으면 기본 테마의 뷰에서 다시 떨어지는 테마를 만들 수 있습니다.
나는 ASP.NET MVC의 테마에 관한 Chris Pietschmann의 훌륭한 기사에 대한 내보기 엔진을 기반으로합니다. 뷰 엔진이 내부적으로 작동하는 방식에 대한 자세한 정보가 포함되어 있으므로 그의 기사를 확인하는 것이 좋습니다.
새로운 뷰 엔진을 사용하면 마스터 페이지, 뷰 및 부분보기에 대한 요청을 해결할 수 있으므로 예외없이 웹 응용 프로그램을 다시 실행할 수 있습니다.
비고 : 뷰 엔진이 특정 마스터 페이지, 뷰 또는 부분보기에 대한 요청을 해결할 수 없도록 코드를 약간 변경했습니다. 기본 테마에서 찾은 것들에 다시 떨어집니다. 따라서이 기사의 소스 코드도 확인하십시오.
빠르게 새로운 테마를 만들어 봅시다. 테마 폴더 아래에 "빨간색"이라는 새 폴더를 추가하십시오. 다음 그림과 같이 Site.master 및 Site.css를 기본 테마에서 복사하십시오.
그림 8- 빨간색 테마

빨간색 테마의 스타일 시트를 열고 바디 요소의 배경색 속성을 변경하십시오. 빨간색으로 설정하십시오. 이제 [리셀러] 테이블을 열고 도메인이 LocalHost로 설정된 리셀러의 테마 필드를 "빨간색"으로 설정하십시오. 웹 응용 프로그램을 다시 시작하면 이제 빨간색 테마의 마스터 페이지와 스타일 시트를 사용해야합니다.
그림 9- 적색 테마 작동

마찬가지로 마스터 페이지뿐만 아니라 홈페이지의 다른 모습도 포함 된 주황색 테마를 만들 수 있습니다.
그림 10- 오렌지 테마

주황색 테마는 기본보기 대신 홈페이지의 새로운보기를 렌더링합니다. 부분보기를 교체하려면 같은 방식으로 그렇게 할 수 있습니다. 기본 부분보기를 새 테마 폴더 아래에서 동일한 위치에 복사하고 필요에 따라 조정하십시오.
각 테마마다 이제 다른 마스터 페이지,보기 및 부분보기를 제공 할 수 있습니다. 내가 지원하고자하는 나머지 시나리오가 하나 있습니다. 기본보기에 만족하지만 로고, 일부 색상 등을 조정하려는 리셀러. 기본 테마에 다른 스타일 시트를 적용하여 쉽게 만족할 수 있습니다.
테마 디렉토리 아래에 새 테마 폴더를 추가하고 녹색이라고 부릅니다. 다음 그림과 같이 기본 테마의 스타일 시트를 녹색 테마에 복사하십시오.
그림 11- 녹색 테마

녹색 테마의 스타일 시트를 열고 바디 요소의 배경색 속성을 녹색으로 조정하십시오. 도메인 로컬 호스트로 리셀러의 테마를 녹색으로 설정하고 응용 프로그램을 시작하면 여전히 기본 테마의 스타일 시트를 사용하고 있음을 알 수 있습니다.
이는 녹색 테마에 자체 마스터 페이지가 없다는 사실로 인해 발생합니다. 기본 테마의 마스터 페이지를 사용 하고이 마스터 페이지는 자체 스타일 시트를 참조합니다.
기본 테마의 마스터 페이지를 열고 라인을 교체하십시오.
< link href =" ../../Content/Site.css " rel =" stylesheet " type =" text/css " />~와 함께
< link href =" <% " ="Html.GetThemedStyleSheet()" % /> rel="stylesheet"
type="text/css" / >getTheMedStylesheet () 메소드는 HTML 유틸리티 클래스의 확장 메소드입니다. 프로젝트에 htmlhelperextensions라는 새 클래스를 추가하고 다음 코드를 추가하십시오.
목록 9 -htmlhelperextensions
public static class HtmlHelperExtensions
{
public static string GetThemedStyleSheet ( this HtmlHelper html )
{
HttpContext context = HttpContext . Current ;
if ( context == null )
{
throw new InvalidOperationException ( "Http Context cannot be null." ) ;
}
string defaultStyleSheet = context . Server . MapPath ( "~/Themes/Default/Content/Site.css" ) ;
string domain = context . Request . Url . GetDomain ( ) ;
string cacheKey = String . Format ( CultureInfo . InvariantCulture , "theme_for_{0}" , domain ) ;
string theme = ( string ) context . Cache [ cacheKey ] ;
if ( String . IsNullOrEmpty ( theme ) || theme == "Default" )
{
return defaultStyleSheet ;
}
string styleSheet = context . Server . MapPath ( String . Format ( CultureInfo . InvariantCulture ,
"~/Themes/{0}/Content/Site.css" , theme ) ) ;
if ( ! File . Exists ( styleSheet ) )
{
styleSheet = defaultStyleSheet ;
}
return String . Format ( CultureInfo . InvariantCulture , "'{0}'" , styleSheet ) ;
}
}getTheMedStyLesheet () 메소드는 HTTPapplication의 캐시에서 테마를로드 하고이 테마에 고유 한 스타일 시트가 있는지 확인합니다. 그렇지 않으면 기본 테마의 스타일 시트로 돌아갑니다. 코드에는 일부 하드 코딩 문자열이 포함되어 있지만 최적은 아니지만 트릭을 수행합니다. 이 방법을 자유롭게 개선하십시오.
웹 애플리케이션을 시작하면 이제 멋진 녹색 배경을 얻을 수 있습니다.
이 기사에서는 ASP.NET MVC에서 테마를 활성화 할 수있는 방법을 보여줍니다. 그렇게하려면 두 가지, 즉 두 가지만 구현하면됩니다.
우리가 구현 한 테마 시스템은 기본 테마를 사용 하고이 기본 테마의 일부를 사용자 정의 테마의 일부로 바꿔야하는지 확인합니다. 다음 시나리오 중 하나를 쉽게 지원하거나 결합 할 수 있습니다.