3

我在这里没有想法了。也许你可以建议我使用什么模式或方法。

用户应该只能为他/她的个人资料登录和更改外观。个性化的区别(AFAIK)是个性化布局仅对编辑者(他/她自己)可见。我猜,皮肤的区别在于皮肤是预定义的,但用户应该能够自己更改设置。

我需要能够向访问作者页面的每个人显示自定义布局。

好的解决方案是将布局信息保存在数据库表中。它也应该被缓存,我猜想从数据库中取出负载并在 CSS 中使用。

谢谢

编辑:

好的,我现在已经做了一些研究。想出了这样的想法。

在视图中,从数据库中获取 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)”的不可空类型“System.Guid”的参数“userId”的空条目。

欢迎任何建议,谢谢。

4

4 回答 4

2

您可以在 Rob Conery 开发的 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 的站点的主 url,Index 方法。此方法返回由视图引擎呈现的 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

How much customisation do you need? Storing an entire css in the database 1 style at a time seems a little overkill, are you sure your users really need / want that level of customisation?

Wouldn't it be simpler to present a list of themes, allow the user to select the one they want and then store that information with the user profile so that when you retrieve the profile details you also retrieve the theme. This information can then be used to select the appropriate master as well as passed to the view to render the correct stylesheet(s).

If you really want to allow extreme customisation down to the individual style level, I would use a default css and then when the user customises their layout, copy the default and alter as necessary, creating a custom css for the user. Each time the user updates their profile layout, simply update the css file with the changes. To get around css caching, record an incrementing version number for each change and append that to the end of the url for the css e.g. <link rel="stylesheet" href="user001.css?v=2>.

于 2010-01-11T19:04:59.663 回答
0

您可以使用 CMS 框架。请参阅此问题以获取建议

于 2010-01-07T14:22:31.927 回答
0

您可以动态构建 CSS 文件并将 css 名称保存在用户的数据库条目中。

于 2010-01-07T22:50:35.673 回答