2012-10-17 3 views
1

두 곳의 사이트가 꽤 비슷하지만 어떤 곳에서는 공통점이 많지만 다른 곳에서는 완전히 다릅니다. 그래서 세 개의 mvc4 응용 프로그램 MainSiteA, MainSiteB, SharedUI를 만들고 RazorGenerated를 사용하여 두 사이트 간의 프리 컴파일 (및 공유)을 수행했습니다. 현재의 문제점은 내 SharedUI보기가 MainSiteA의 컴파일 된 또는 컴파일되지 않은보기에서 우선 순위를 가지며, 그 반대의 경우도 마찬가지입니다.MVC 면도기 분리 된 DLL

갖는

SiteA: 
    Views/Index.cshtml (a) 

SiteB: 
    Views/Index.cshtml (b) 
    Views/Header.cshtml (b) 

SharedUI: 
    Views/Index.cshtml (s) 
    Views/Header.cshtml (s) 
    Views/Footer.cshtml (s) 

가 어떻게 특정 페이지가이 방법으로 사이트에 따라 액세스 할 수 있습니다 :

SiteA 
Index.cshtml (a) 
Header.cshtml (s) 
Footer.cshtml (s) 

SiteB 
Index.cshtml (b) 
Header.cshtml (b) 
Footer.cshtml (s) 

내가 MVC는 그 자체가 MVC 응용 프로그램에서 처음보고 싶다, 뷰가 발견되지 않으면 뷰의 공유 라이브러리 (SharedUI)를 살펴보십시오.

+1

비슷한 솔루션을 구현했습니다 : http://stackoverflow.com/questions/9838766/implementing-a-custom-razorviewengine – Liam

답변

5

RazorGenerator.Mvc 2.1.0에는 CompositePrecompiledMvcEngine 클래스가 포함됩니다. 당신이 등록 할 때

// ... 
    PrecompiledViewAssembly.OfType<SomeSiteBClass>(
// ... 

: 사이트 B에 대한

var engine = new CompositePrecompiledMvcEngine(
    PrecompiledViewAssembly.OfType<SomeSharedUIClass>(), 
    PrecompiledViewAssembly.OfType<SomeSiteAClass>(
     usePhysicalViewsIfNewer: HttpContext.Current.IsDebuggingEnabled)); 

ViewEngines.Engines.Insert(0, engine); 
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine); 

과 비슷한 코드 : 각 프로젝트 내에서 귀하의 의견을 미리 컴파일 RazorGenerator를 사용하는 경우, 당신은 지금 사이트 A에 대해 다음과 같은 엔진 등록을 사용할 수 있습니다 엔진 생성자의 어셈블리를 사용하면 각 요소에 뷰의 가상 경로 (키)와 컴파일 된 뷰 유형 (값) 간의 매핑이 포함 된 해시 테이블을 작성합니다. 이러한 키가 이전 어셈블리 중 하나에 이미 등록되어 있으면이 매핑을 현재 어셈블리의 형식으로 재정의합니다. 당신이 사이트 A 어셈블리 등록을 넣을 때

"~/Views/Index.cshtml" -> SharedUI.Index 
"~/Views/Header.cshtml" -> SharedUI.Header 
"~/Views/Footer.cshtml" -> SharedUI.Footer 

가, 해시 테이블이 포함됩니다 :

그래서, SharedUI 조립 등록 후, 해시 테이블은 다음과 같은 매핑을 포함됩니다

"~/Views/Index.cshtml" -> SiteA.Index 
"~/Views/Header.cshtml" -> SharedUI.Header 
"~/Views/Footer.cshtml" -> SharedUI.Footer 

을 그리고 다른를 넣어 경우 "~/Views/Footer.cshtml"및 "~/Views/Sidebar.cshtml"보기가 포함 된 해시 테이블은 해시 테이블에 다음을 포함합니다.

"~/Views/Index.cshtml" -> SiteA.Index 
"~/Views/Header.cshtml" -> SharedUI.Header 
"~/Views/Footer.cshtml" -> Another.Footer 
"~/Views/Sidebar.cshtml" -> Another.Sidebar 
+0

각 프로젝트에 엔진을 등록해야하는지, 한 번만 등록해야합니까? 공유보기 (및 RazorGenerator)가있는 프로젝트에서? –

+1

@hbob, 네, 그 공유보기를 사용하려는 각 프로젝트에 엔진을 등록해야합니다. – odinserj

+0

OK, 각 "공유 된"MVC 프로젝트는 기본'PrecompiledMvcEngine'을 등록하지만 각 "자식"MVC 프로젝트는'CompositePrecompiledMvcEngine'을 등록합니까? –