3

MVC 3 アプリケーションを構築しています。アプリケーションは、サブドメインに応じて異なるレイアウトを表示できる必要があります (例: customer1.mysite.com -> layout1; customer2.mysite.com -> layout2; など...)。モバイルおよびIE6。

それらは、レイアウトを設定するロジックを実行するために利用できる _ViewStart.cshtml であることがわかりました。しかし、私が得られないのは、そのコントローラーがどこにあるのですか? ビューにすべてのコードを記述する必要がありますか?

レイアウトに関する別の質問は、一般的な動作のコードをどのように除外するのですか? そのためのコントローラーはありますか?

最後に、asp.net MVC2 の領域の概念を見てきましたが、Razor を使用した今では時代遅れですか?

ご協力ありがとうございました

フレッド

4

2 に答える 2

2

これは、ViewBagを使用する良い機会のように思えます。

アイデアは、OnActionExecuting中にサブドメインを検索し、それを ViewBag に押し込むというものです。これは、他のコントローラーが継承するカスタム BaseController で、またはActionFilterから行うことができます。

次に、_ViewStart で、ViewBag に switch ステートメントを記述してレイアウトを制御できます。

たとえば、_ViewStart.cshtml を@ViewBag.Subdomain含む任意の Razor ビューに設定される ActionFilter を次に示します。

public class AddSubdomainToViewDataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var subdomain = filterContext.HttpContext.Request.Url.Authority.Split('.').First();
        var controller = filterContext.Controller as Controller;
        controller.ViewData.Add("Subdomain", subdomain);
    }
}

[AddSubdomainToViewData]次に、この新しい属性でコントローラーを装飾します。

最後に、_ViewStart.cshtml で次のようにします。

@{
    Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml";
}

これにより、サブドメインごとに異なる Razor レイアウトが使用されます。

于 2011-03-17T14:15:57.327 に答える
1

_ViewStart でこれを行うこともできますが、より良い方法は、ユーザー エージェントまたはドメインに基づいて別のレイアウトを含むカスタム ビュー エンジンを作成することだと思います。次に、共通のコントローラーとビューがあり、レイアウトのみが異なります。

于 2011-03-17T13:10:54.110 に答える