Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc .NETMVC:如何实现每个用户不同的页面外观?_Asp.net Mvc_Css_Dynamic_C# 3.0_Appearance - Fatal编程技术网

Asp.net mvc .NETMVC:如何实现每个用户不同的页面外观?

Asp.net mvc .NETMVC:如何实现每个用户不同的页面外观?,asp.net-mvc,css,dynamic,c#-3.0,appearance,Asp.net Mvc,Css,Dynamic,C# 3.0,Appearance,我这里的点子快用完了。也许你可以建议我使用什么模式或方法 用户应能够登录并仅更改其个人资料的外观。 个性化的区别(AFAIK)在于,个性化的布局只针对编辑(他/她自己)。 我想,蒙皮之间的区别在于,蒙皮是预定义的,但是用户应该能够自己更改设置 我需要能够向每个访问作者页面的人显示定制的布局 好的解决方案是将布局信息保存在DB表中。我想它应该被缓存,以减轻数据库的负载,并在CSS中使用 谢谢 编辑: 好的,我现在已经做了一些研究。提出了这样的想法 在视图中,从数据库获取用户ID(Guid类型),并

我这里的点子快用完了。也许你可以建议我使用什么模式或方法

用户应能够登录并仅更改其个人资料的外观。 个性化的区别(AFAIK)在于,个性化的布局只针对编辑(他/她自己)。 我想,蒙皮之间的区别在于,蒙皮是预定义的,但是用户应该能够自己更改设置

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

好的解决方案是将布局信息保存在DB表中。我想它应该被缓存,以减轻数据库的负载,并在CSS中使用

谢谢

编辑:

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

在视图中,从数据库获取用户ID(Guid类型),并将其设置为ViewData: ViewData[“userId”]=profile.userId

该视图使用以下名为“Profile.Master”的母版页和指向动态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);
}
公共操作结果样式(Guid用户ID) { var styles=(来自Db.UserStyleSet.OfType()中的s) 其中s.aspnet_Users.UserId==UserId 选择s); 返回视图(“样式”,样式); } 问题在于,用户ID从未传递到动态CSS链接:

参数字典包含“Project.Controllers.ProfileController”中方法“System.Web.Mvc.ActionResult Style(System.Guid)”的非null类型“System.Guid”的参数“userId”的null条目


欢迎提供任何建议,谢谢。

您可以使用CMS框架。有关建议,请参阅。

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

您可以在Rob Connery开发的Kona项目中找到非常简洁的布局自定义功能。运行源代码时,您将看到布局管理UI,它允许您更改每个组件在屏幕上的位置

        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);
                }
            }
        }
    }
在那里使用的方法如下:

  • 当页面呈现时,我们的自定义视图引擎检查应该显示哪个母版页(这样我们就可以根据当前设置切换主题)

  • 视图引擎使用母版页并呈现由使用路由表解析的特定控制器操作定义的视图。例如,我们键入了指向主控制器的站点的主url,索引方法。此方法返回由视图引擎呈现的Index.aspx视图

  • 当视图引擎呈现Index.aspx页面时,它会启动帮助程序方法,如

  • 此方法真正负责为aspx页面中的每个div呈现特定的widdges。这样,如果用户更改小部件的布局,它们将正确显示在屏幕上

            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);
                    }
                }
            }
        }
    
    publicstaticvoidrenderwidgets(此视图页pg,Kona.Infrastructure.Page,bool useditor,字符串区域){
    如果(第页!=null){
    foreach(page.Widgets.Where(x=>x.Zone.Equals(Zone,StringComparison.InvariantCultureIgnoreCase))中的IWidget小部件){
    字符串viewName=useEditor?widget.EditorName:widget.viewName;
    如果(widget.ViewName!=null){
    if(widget.IsTyped){
    var typedWidget=widget作为widget;
    RenderPartial(viewName,typedWidget);
    }否则{
    RenderPartial(视图名称、小部件);
    }
    }如果(!string.IsNullOrEmpty(widget.Title)){
    RenderPartial(“标题文本”,小部件);
    }否则{
    RenderPartial(“TextOnly”,小部件);
    }
    }
    }
    }
    

    用户如何更改布局?Kona有非常简洁的javascript,它与Ajax一起使用,用户只需将小部件从一个面板拖放到另一个面板即可重新排序布局。

    您需要多少定制?一次将整个css存储在database 1样式中似乎有点过火,您确定您的用户真的需要/想要这种定制级别吗

    提供一个主题列表不是更简单吗?允许用户选择他们想要的主题,然后将该信息存储在用户配置文件中,这样当您检索配置文件详细信息时,您也可以检索主题。然后可以使用此信息选择适当的主控形状,并将其传递给视图以呈现正确的样式表


    如果你真的想允许极端定制到个人风格级别,我会使用默认的css,然后当用户定制他们的布局时,复制默认值并根据需要修改,为用户创建自定义css。每次用户更新他们的配置文件布局时,只需使用更改更新css文件即可。要绕过css缓存,请为每次更改记录一个递增的版本号,并将其附加到css url的末尾。例如,
    听起来好像您已经知道要采取的路径…将自定义数据存储在DB中。同时,这对于我的项目来说不是一个很好的解决方案。当有很多CSS文件时,速度会变慢。数据库意味着保存/处理大量数据。你的第二句话与第三句话相矛盾。我只允许用户更改颜色。没有布局更改。用户将用自定义颜色填写表单,并按样式组(即,主体标记的样式)将其存储在DB中。自定义CSS将被放置到母版页中,并将覆盖外部CSS文件中定义的样式。请编辑您的原始问题以澄清这一点,因为您同时参考了布局和外观。