很显然,这个类处理的所有的均是默认风格,我们来看一下它的几个主要方法和属性:
// 获取所有风格名称
public ICollection<String> StyleNames { get {;} }
// 根据风格名称获取主题名称
public string GetTheme(string styleName) {}
// 设置、获取 站点默认风格
public string DefaultStyle{}
// 获取默认主题名称
public string DefaultTheme { }
// 根据页面路径获取其对应的 masterPage 的路径
public string GetMasterPage(string userTheme){}
在继续进行之前,我们来考虑这样一个问题:因为我们要根据用户选择的风格来动态地为页面加载主题和模板,那么用户信息(用户选择了什么风格)应该保存在哪里,从哪里获得呢?我们有很多的选择:可以使用Session、可以使用Cookie,还可以保存到数据库中。此时最好将这部分抽象出来,以便日后为不同的方法提供实现。我们定义一个接口 IUserStyleStrategy,它用来定义如何获取、设置用户风格,在AppCode中新建文件IUserStyleStragety.cs:
public interface IUserStyleStrategy{
void ResetUserStyle(string styleName); // 重新设置用户风格
string GetUserStyle(); // 获取用户风格
}
然后我在这里提供了一个基于Cookie的默认实现:
// 默认风格设置方法:使用Cookie记录
public class DefaultStyleStrategy : IUserStyleStrategy {
private string cookieName; // cookie名称
private HttpContext context;
public DefaultStyleStrategy(string cookieName){
this.cookieName = cookieName;
context = HttpContext.Current;
}
// 重新设置用户风格名称
public void ResetUserStyle(string styleName) {
HttpCookie cookie;
if(context.Request.Cookies[cookieName]!=null)
cookie = context.Request.Cookies[cookieName];
else
cookie = new HttpCookie(cookieName);
cookie.Value = context.Server.UrlEncode(styleName);
cookie.Expires = DateTime.Now.AddHours(2); // 设置Cookie过期时间
context.Response.Cookies.Add(cookie);
// 因为风格(master page和theme)的动态设置只能在 PreInit 事件中
// 而Button的Click事件在PreInit事件之后,所以需要Redirect才可以生效
context.Response.Redirect(context.Request.Url.PathAndQuery);
}
// 获取用户自己设置的风格名称
public string GetUserStyle() {
if (context.Request.Cookies[cookieName] != null) {
string value = context.Request.Cookies[cookieName].Value;
value = context.Server.UrlDecode(value); // 避免出现中文乱码
return value;
} else
return null;
}
}