1

私は現在、ユーザーが自分の好みに基づいてテーマとレイアウトを選択できるソリューションを探しています。

黄色と緑の 2 つのテーマを提供する Web サイトがあるとします。

これら 2 つのレイアウトには 2 つの異なるレイアウトがあります。2 列と 3 列のレイアウトで、一部の部分ビューは構造が異なり、機能面も異なります。

私が考えた最善の方法は Areas を使用することでしたが、私が望んでいないのは、URL 構造をまったく変更することではありません。アクションの実行時に舞台裏の領域を設定する変数を使用します。

たとえば、レイアウトを 3 列に設定し、緑色のテーマを使用しています。特定のビューで 3Cols 領域を使用しますが、コントローラーは 2Cols レイアウトとまったく同じコードを実装するため、コントローラーを複製したくありません。

だから、私が達成しようとしていることの要約はこれです:

  • エリアを使用してレイアウトとテーマを切り替える
  • レイアウトごとに 1 つのコントローラーを使用する
  • 選択したレイアウトとは独立して同じ URL を持つ

それについての考え/提案はありますか?

ありがとうございました!

4

1 に答える 1

1

私は探していたものをうまく機能させることができました。それは非常に簡単だと思います!

BaseController クラスを作成しました。

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RouteData.DataTokens["area"] = CurrentLayout;
        base.OnActionExecuting(filterContext);
    }

    public string CurrentLayout
    {
        get
        {
            //Set a default layout if no layout is specified
            if(Session["CurrentLayout"]==null)
                Session["CurrentLayout"] = "Layout1";
            return Session["CurrentLayout"].ToString();
        }

        set
        {
            if (string.IsNullOrWhiteSpace(value) || string.IsNullOrEmpty(value))
                throw new NullReferenceException("CurrentLayout");
            CurrentLayout = value;
        }
    }
}

次に、セッションの開始時にユーザーのプロファイルを読み取り、選択したレイアウトを BaseController が読み取っているセッション変数に入れます。

他には何も必要ありません!

これが他の人に役立つことを願っています。

ありがとう!

于 2012-10-29T17:55:59.217 に答える