0

我正在开发一个将由多个客户端使用的基于 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";

反过来,特定于客户端的LayoutALayoutB都使用DefaultLayout.cshtml 中定义的共享基本设计/布局,方法是在顶部包含以下内容:

@{
    Layout = "~/DefaultLayout.cshtml";
}

我希望实现级联嵌套布局效果,其中SomeSharedViewPage.cshtmlSomeSharedContentPage.cshtml都显示为包含默认元素和自定义元素的最终布局。

不幸的是,即使我对视图中的一个布局进行硬编码,也没有明确指定布局页面的路径(例如Layout="~/Views/ClientA/LayoutA.cshtml",而不是Layout="LayoutA"),它也不起作用。

我究竟做错了什么?


更新

DefaultLayout.cshtml我通过重命名为特定于_Layout.cshtml客户端的布局来使顶级共享布局工作,LayoutALayoutB仍然没有被应用,所以显然 SS Razor 现在只是_Layout.cshtml按照惯例回退了。

我知道最近在 ServiceStack 中添加了对级联嵌套布局的支持,所以我一定做错了。

4

1 回答 1

2

根据我所做的测试,我认为 ServiceStack Razor 不支持 _ViewStart.cshtml。但是,您应该能够使用其他方法通过代码动态更改布局。例如,您可以这样设置:

默认.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。

于 2013-08-12T03:08:43.243 回答