如果日后你需要将信息保存在数据库中,那么你只要重新实现一下这个接口就可以了:
// 如果将用户风格设置存储到了数据库中,可以实现这个接口
public class SqlStyleStrategy : IUserStyleStrategy {
private int userId; // 用户Id
public SqlStyleStrategy(int userId){
this.userId = userId;
// ...
}
public void ResetUserStyle(string styleName) {
throw new NotImplementedException();
}
public string GetUserStyle() {
throw new NotImplementedException();
}
}
因为所有的页面都要运行这样的一个逻辑:判断用户是否有设置风格,如果没有,使用Web.Config中设置的默认风格;如果设置了,使用用户风格。最后动态地给Page类的Theme属性和MasterPageFile属性赋值。
那么我们可以定一个基类,在这个基类中去做这件事,然后让所有的页面继承这个基类;又因为页面是一定要继承自System.Web.UI.Page类的,所以这个基类也必须继承自System.Web.UI.Page。现在在AppCode中再建一个文件 PageBase.cs:
// 供所有基类继承
public class PageBase : Page
{
protected StyleTemplateConfiguration styleConfig;
protected string userStyle; // 用户设置的风格
protected string userTheme; // 用户设置的主题
protected IUserStyleStrategy userStrategy; // 使用何种算法来获得用户自定义的信息
protected override void OnPreInit(EventArgs e) {
base.OnPreInit(e);
// 这里会被缓存只在第一次时调用有用
this.styleConfig = (StyleTemplateConfiguration)ConfigurationManager.GetSection("styleTemplates");
// 当你实现了自己的 Strategy时只需要更改这里就可以了
// 更好的办法是将Stragey的类型保存在Web.config中,
// 然后使用反射来动态创建
userStrategy = new DefaultStyleStrategy("userStyle");
// 获取用户风格
userStyle = userStrategy.GetUserStyle();
// 如果用户没有设置风格,使用默认风格
if (String.IsNullOrEmpty(userStyle)) {
userStyle = styleConfig.DefaultStyle;
userTheme = styleConfig.DefaultTheme;
} else {
// 根据用户设置的风格 获取 主题名称
userTheme = styleConfig.GetTheme(userStyle);
}
// 根据当前页获取MasterPage的路径
string masterPagePath = styleConfig.GetMasterPage(userTheme);
// 设置当前页的MasterPage
if (masterPagePath != null)
this.MasterPageFile = masterPagePath;
this.Theme = userTheme; // 设置当前页的主题
}
}