Asp.net mvc .NETMVC:如何实现每个用户不同的页面外观?
我这里的点子快用完了。也许你可以建议我使用什么模式或方法 用户应能够登录并仅更改其个人资料的外观。 个性化的区别(AFAIK)在于,个性化的布局只针对编辑(他/她自己)。 我想,蒙皮之间的区别在于,蒙皮是预定义的,但是用户应该能够自己更改设置 我需要能够向每个访问作者页面的人显示定制的布局 好的解决方案是将布局信息保存在DB表中。我想它应该被缓存,以减轻数据库的负载,并在CSS中使用 谢谢 编辑: 好的,我现在已经做了一些研究。提出了这样的想法 在视图中,从数据库获取用户ID(Guid类型),并将其设置为ViewData: ViewData[“userId”]=profile.userId 该视图使用以下名为“Profile.Master”的母版页和指向动态CSS文件的链接: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类型),并
<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);
}
}
}
}
在那里使用的方法如下:
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文件中定义的样式。请编辑您的原始问题以澄清这一点,因为您同时参考了布局和外观。