我正在开发一个基于ServiceStack的Web应用程序,供多个客户端使用。默认布局/设计将在没有特定于客户端的情况下使用。所以我希望能够利用ServiceStack Razor中现有的级联布局模板的支持,但是没有运气使它工作。
以下是我在项目中构建视图的方法:
\
_ViewStart.cshtml
DefaultLayout.cshtml
SomeSharedContentPage.cshtml
\Views
SomeSharedViewPage.cshtml
\ClientA
LayoutA.cshtml
StylesA.css
\ClientB
LayoutB.cshtml
StylesB.css
_ ViewStart.cshtml 中的逻辑检查登录用户的身份,并设置相应的布局类型(以简化形式):
if (user.Client.ID == CLIENT_A_ID)
Layout = "~/Views/ClientA/LayoutA.cshtml";
else
Layout = "~/Views/ClientB/LayoutB.cshtml";
反过来,客户特定的 LayoutA 和 LayoutB 都使用 DefaultLayout.cshtml 中定义的共享基本设计/布局,包括以下内容在顶部:
@{
Layout = "~/DefaultLayout.cshtml";
}
我希望实现级联嵌套布局效果,同时显示 SomeSharedViewPage.cshtml 和 SomeSharedContentPage.cshtml ,最终布局包含默认元素和自定义元素。
不幸的是,即使我在视图中硬编码其中一个布局,也没有明确指定布局页面的路径(例如Layout="~/Views/ClientA/LayoutA.cshtml"
而不是Layout="LayoutA"
),它也不起作用。
我做错了什么?
更新
我通过将DefaultLayout.cshtml
重命名为_Layout.cshtml
来实现顶级共享布局,但仍未应用特定于客户端的布局LayoutA
和LayoutB
,因此显然SS Razor现在只是按惯例回到_Layout.cshtml
。
我知道对cascading nested layouts was recently added to ServiceStack的支持,所以我一定做错了。
答案 0 :(得分:2)
根据我所做的测试,我不认为ServiceStack Razor支持_ViewStart.cshtml。但是,您应该能够使用其他方法通过代码动态更改布局。例如,您可以这样设置:
Default.cshtml
<h2>Default</h2>
Views \ _Layout.cshtml(ServiceStack Razor的默认设置)
@{
if (user.Client.ID == CLIENT_A_ID)
Layout = "_Layout2";
else
Layout = "_Layout3";
}
视图\ _Layout2.cshtml
<h1>Layout2</h1>
@RenderBody()
视图\ _Layout3.cshtml
<h1>Layout3</h1>
@RenderBody()
您还应该能够使用\ Views \ ClientA \ ALayout.cshtml,但您必须确保所有布局文件都使用唯一的名称,如ALayout.cshtml和BLayout.cshtml。