3

ここでアイデアが不足しています。使用するパターンや方法を教えてください。

ユーザーはログインして、自分のプロファイルの外観のみを変更できる必要があります。パーソナライゼーションとの違い (AFAIK) は、パーソナライズされたレイアウトが編集者 (彼/彼女自身) にのみ表示されることです。スキニングとの違いは、スキンは事前定義されていますが、ユーザーは自分で設定を変更できる必要があることです。

著者のページにアクセスするすべての人に、カスタマイズされたレイアウトを表示できるようにする必要があります。

良い解決策は、レイアウト情報を DB テーブルに保持することです。また、DB から負荷を取り除き、CSS で使用するためにキャッシュする必要があります。

ありがとう

編集:

OK私は今いくつかの研究をしました。このような考えに至りました。

View で DB から userId (Guid タイプ) を取得し、それを ViewData に設定します。 ViewData["userId"] = profile.userId;

そのビューは、「Profile.Master」と呼ばれる次の MasterPage と動的 CSS ファイルへのリンクを使用します。

    <link href="<%= Url.Action("Style", "Profile", 
        ViewData["userId"]) %>" rel="stylesheet" type="text/css" />
</head>

ProfileController で、DB から CSS データを取得し、動的 ​​CSS ビューに返します。

public ActionResult Style(Guid userId)
{
    var styles = (from s in Db.UserStyleSet.OfType<UserStyle>()
                  where s.aspnet_Users.UserId == userId
                  select s);

    return View("Style", styles);
}

問題は、UserId が動的 CSS リンクに渡されないことです。

パラメーター ディクショナリには、'Project.Controllers.ProfileController' のメソッド 'System.Web.Mvc.ActionResult Style(System.Guid)' の null 非許容型 'System.Guid' のパラメーター 'userId' の null エントリが含まれています。

どんなアドバイスでも大歓迎です、ありがとう。

4

4 に答える 4

2

RobConeryによって開発されたKonaプロジェクトにある非常にすっきりとしたレイアウトのカスタマイズ機能。ここにあるソースコードを実行すると、画面上の各コンポーネントの位置を変更できるレイアウト管理UIが表示されます。

そこで使用されるアプローチは次のとおりです。

  1. ページがレンダリングされると、カスタマイズされたビューエンジンがどのマスターページを表示するかを確認します(このようにして、現在の設定に基づいてテーマを切り替えることができます)

        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) {
        ViewEngineResult result = null;
        var request = controllerContext.RequestContext;
        if (controllerContext.Controller.GetType().BaseType == typeof(KonaController)) {
            var orchardController = controllerContext.Controller as KonaController;
            string template = orchardController.ThemeName;
    
  2. ビューエンジンはマスターページを使用し、ルートテーブルを使用して解決された特定のコントローラーアクションによって定義されたビューをレンダリングします。たとえば、Home Controller、Indexメソッドを指すサイトのメインURLを入力しました。このメソッドは、ViewエンジンによってレンダリングされたIndex.aspxビューを返しました。

  3. ビューエンジンがIndex.aspxページをレンダリングしている間、次のようなヘルパーメソッドを起動します。

    <%this.RenderWidgets( "sidebar1"); %>。

このメソッドは、aspxページの各divごとに特定のウィジェットをレンダリングする役割を果たします。このように、ユーザーがウィジェットのレイアウトを変更した場合、ウィジェットは画面に正しく表示されます。

        public static void RenderWidgets(this ViewPage pg,  Kona.Infrastructure.Page page, bool useEditor, string zone) {
        if (page != null) {
            foreach (IWidget widget in page.Widgets.Where(x => x.Zone.Equals(zone, StringComparison.InvariantCultureIgnoreCase))) {

                string viewName = useEditor ? widget.EditorName : widget.ViewName;


                if (widget.ViewName != null) {
                    if (widget.IsTyped) {
                        var typedWidget = widget as Widget<IList<Product>>;
                        pg.Html.RenderPartial(viewName, typedWidget);
                    } else {
                        pg.Html.RenderPartial(viewName, widget);
                    }
                } else if (!string.IsNullOrEmpty(widget.Title)) {
                    pg.Html.RenderPartial("TitleAndText", widget);

                } else {
                    pg.Html.RenderPartial("TextOnly", widget);
                }
            }
        }
    }

ユーザーはどのようにしてレイアウトを変更できますか?Konaには非常に優れたJavaScriptがあり、Ajaxと一緒に使用され、ユーザーはウィジェットをあるパネルから別のパネルにドラッグアンドドロップするだけでレイアウトを並べ替えることができます。

于 2010-01-09T22:02:45.493 に答える
0

CSSファイルを動的に作成し、css名をユーザーのdbエントリに保存できます。

于 2010-01-07T22:50:35.673 に答える
0

どの程度のカスタマイズが必要ですか? CSS 全体を一度に 1 つのスタイルでデータベースに格納するのは少しやり過ぎのように思えます。ユーザーがそのレベルのカスタマイズを本当に必要としている/望んでいると確信していますか?

テーマのリストを表示し、ユーザーが必要なテーマを選択できるようにし、その情報をユーザー プロファイルに保存して、プロファイルの詳細を取得するときにテーマも取得する方が簡単ではないでしょうか。次に、この情報を使用して適切なマスターを選択したり、ビューに渡して正しいスタイルシートをレンダリングしたりできます。

個々のスタイル レベルまで極端なカスタマイズを本当に許可したい場合は、デフォルトの css を使用し、ユーザーがレイアウトをカスタマイズするときに、デフォルトをコピーして必要に応じて変更し、ユーザー用のカスタム css を作成します。ユーザーがプロファイル レイアウトを更新するたびに、変更内容で css ファイルを更新するだけです。CSS キャッシングを回避するには、変更ごとにインクリメントするバージョン番号を記録し、それを CSS の URL の末尾に追加します<link rel="stylesheet" href="user001.css?v=2>

于 2010-01-11T19:04:59.663 に答える
0

CMS フレームワークを使用できます。提案については、この質問を参照してください

于 2010-01-07T14:22:31.927 に答える