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のロジックは、ログインしているユーザーの ID をチェックし、次のような適切なレイアウトの種類を (簡略化された形式で) 設定します。

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の両方がデフォルト要素とカスタム要素の両方で構成される最終的なレイアウトで表示されるカスケード ネスト レイアウト効果を実現したいと考えていました。

残念ながら、ビュー内のレイアウトの 1 つをハードコードしたり、レイアウト ページのパスを明示的に指定したりしても機能しません (例:Layout="~/Views/ClientA/LayoutA.cshtml"の代わりにLayout="LayoutA")。

私は何を間違っていますか?


アップデート

クライアント固有のレイアウトに名前を変更DefaultLayout.cshtmlすることで、トップレベルの共有レイアウトが機能するようになりましたが、まだ適用されていないため、明らかに SS Razor は慣例により単純にフォールバックします。_Layout.cshtmlLayoutALayoutB_Layout.cshtml

ネストされたレイアウトのカスケードのサポートが最近 ServiceStack に追加されたことを知っているので、何か間違ったことをしているに違いありません。

4

1 に答える 1

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 のような一意の名前を使用していることを確認する必要があります。

于 2013-08-12T03:08:43.243 に答える