.NET MVC: как реализовать различный внешний вид страницы для пользователя? - PullRequest
3 голосов
/ 07 января 2010

У меня заканчиваются идеи здесь. Может быть, вы можете посоветовать мне, какой шаблон или метод (ы) использовать.

Пользователь должен иметь возможность войти и изменить только внешний вид для своего профиля. Разница (AFAIK) с персонализацией заключается в том, что персонализированный макет виден только для редактора (самого себя). Разница между скинами, я полагаю, заключается в том, что скины предопределены, но пользователи должны иметь возможность самостоятельно изменять настройки.

Мне нужно иметь возможность отображать индивидуальный макет для всех, кто посещает страницу автора.

Хорошим решением было бы сохранить информацию о макете в таблице БД. Также это должно быть кэшировано, я думаю, чтобы снять нагрузку с БД и использовать в CSS.

Спасибо

Изменить:

ОК. Я провел небольшое исследование. Придумали такую ​​идею.

В представлении получите userId (тип Guid) из БД и установите для него ViewData: ViewData ["userId"] = profile.userId;

В этом представлении используется следующая мастер-страница с именем «Profile.Master» и ссылки на динамический файл CSS:

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

В ProfileController получите данные 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);
}

Проблема в том, что идентификатор пользователя никогда не передается на динамическую ссылку CSS:

Словарь параметров содержит пустую запись для параметра 'userId' ненулевого типа 'System.Guid' для метода 'System.Web.Mvc.ActionResult Style (System.Guid)' в Project.Controllers.ProfileController ' .

Любой совет приветствуется, спасибо.

Ответы [ 4 ]

2 голосов
/ 10 января 2010

Очень аккуратные функции настройки макета, которые вы можете найти в проекте Kona, разработанном Робом Конери. Когда вы запускаете исходный код, который вы можете найти здесь , вы увидите интерфейс управления макетом, который позволяет вам изменять положение каждого компонента на экране.

Используемый здесь подход следующий:

  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. Механизм просмотра использует главную страницу и отображает представление, которое было определено определенным действием контроллера, разрешенным с использованием таблиц маршрутов. Например, мы набрали основной URL сайта, который указывал на Home Controller, метод Index. Этот метод возвратил представление Index.aspx, которое было обработано механизмом просмотра.

  3. Когда движок представления отображает страницу Index.aspx, он запускает вспомогательные методы, такие как

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

Этот метод действительно отвечает за рендеринг определенных виджетов для каждого div на странице aspx. Таким образом, если ваш пользователь изменит расположение виджетов, они будут правильно отображены на экране.

        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, и пользователь просто перетаскивает виджеты с одной панели на другую, чтобы изменить порядок расположения.

0 голосов
/ 11 января 2010

Сколько настроек вам нужно? Хранение всего CSS в базе данных 1 стиль за один раз кажется немного излишним, вы уверены, что ваши пользователи действительно нуждаются / хотят такой уровень настройки?

Не проще ли представить список тем, позволяющих пользователю выбрать ту, которая ему нужна, и затем сохранить эту информацию в профиле пользователя, чтобы при получении сведений о профиле вы также получали тему. Затем эту информацию можно использовать для выбора соответствующего мастера, а также для передачи в представление для отображения правильных таблиц стилей.

Если вы действительно хотите разрешить экстремальную настройку вплоть до индивидуального уровня стиля, я бы использовал css по умолчанию, а затем, когда пользователь настраивает свой макет, копирует значение по умолчанию и при необходимости изменяет его, создавая пользовательский css. Каждый раз, когда пользователь обновляет макет своего профиля, просто обновляйте файл CSS с изменениями. Чтобы обойти кэширование CSS, запишите увеличивающийся номер версии для каждого изменения и добавьте его в конец URL для CSS, например, <link rel="stylesheet" href="user001.css?v=2>.

0 голосов
/ 08 января 2010

Вы можете динамически создать файл CSS и сохранить имя CSS в записи БД пользователя.

0 голосов
/ 07 января 2010

Вы можете использовать платформу CMS. См. этот вопрос для предложений

...