1

我有两个非常相似的站点,它们在某些地方有很多共同点,但在其他一些地方却完全不同。所以我创建了三个 mvc4 应用程序 MainSiteA、MainSiteB、SharedUI 并使用 RazorGenerated 在两个站点之间预编译(和共享)视图。当前的问题是我的 SharedUI 视图优先于 MainSiteA 上的已编译或非编译视图,我希望它使其反之亦然。

有:

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)。

4

1 回答 1

5

RazorGenerator.Mvc 2.1.0 包括 CompositePrecompiledMvc​​Engine 类。如果您使用 RazorGenerator 在每个项目中预编译您的视图,您现在可以为站点 A 使用以下引擎注册:

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

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

站点 B 的类似代码:

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

当您在引擎的构造函数中注册程序集时,它会构建哈希表,其中每个元素都包含视图的虚拟路径(键)和编译视图类型(值)之间的映射。如果这样的键已经注册到以前的程序集之一,它只是用当前程序集的类型覆盖这个映射。

因此,在 SharedUI 程序集注册之后,哈希表将包含以下映射:

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

当您将 SiteA 程序集注册时,哈希表将包含:

"~/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
于 2013-06-07T07:26:25.373 回答