根据每个客户设置ServiceStack Razor视图的布局

时间:2013-07-23 17:55:25

标签: asp.net-mvc razor servicestack

我正在开发一个基于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来实现顶级共享布局,但仍未应用特定于客户端的布局LayoutALayoutB,因此显然SS Razor现在只是按惯例回到_Layout.cshtml

我知道对cascading nested layouts was recently added to ServiceStack的支持,所以我一定做错了。

1 个答案:

答案 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。