我想在我的MVC 5应用程序中包含bootswatch主题的主题支持。
我希望用户的主题被保存和加载时,他们登录。
我已经扩展了我的用户类以包含主题,并且可以成功地在编辑用户页面上设置和保存主题。
public class User : IdentityUser
{
public string BootstrapTheme {get;set;}
}
在BootstrapTheme属性中,我将保存bootstrap css链接的href属性。eg "~/Content/bootstrap.flatly.min.css"
计划是在布局页面中设置主题。
<link href="~/Content/bootstrap.spacelab.min.css" rel="stylesheet" />
我如何做到这一点,而不是在每次页面加载时查询数据库?
能够做像<link href="@User.BootstrapTheme" rel="stylesheet" />
这样的事情将是理想的。
这里有一个关于如何使用localstorage http://wdtz.org/bootswatch-theme-selector.html将其保存为一个页面的链接
您应该将主题名称/url存储为对用户的声明,而不是作为User
类的一部分:
await userManager.AddClaimAsync(user.Id, new Claim("MyApp:ThemeUrl", "~/Content/bootstrap.flatly.min.css"));
当用户登录时,此声明被添加到cookie中,您可以通过扩展方法访问它:
public static String GetThemeUrl(this ClaimsPrincipal principal)
{
var themeClaim = principal.Claims.FirstOrDefault(c => c.Type == "MyApp:ThemeUrl");
if (themeClaim != null)
{
return themeClaim.Value;
}
// return default theme url if no claim is set
return "path/to/default/theme";
}
在你的视图中,你可以这样访问主题url:
<link href="@ClaimsPrincipal.Current.GetThemeUrl()" rel="stylesheet" />
本金债权在cookie中可用,因此不需要额外的DB点击。
作为另一种选择,您可以像您已经做过的那样保留用户BootstrapTheme
,但是当用户登录时,将此主题添加为身份声明:
public async Task SignInAsync(IAuthenticationManager authenticationManager, ApplicationUser applicationUser, bool isPersistent)
{
authenticationManager.SignOut(
DefaultAuthenticationTypes.ExternalCookie,
DefaultAuthenticationTypes.ApplicationCookie);
var identity = await this.CreateIdentityAsync(applicationUser, DefaultAuthenticationTypes.ApplicationCookie);
identity.AddClaim(new Claim("MyApp:ThemeUrl", applicationUser.BootstrapTheme));
authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
然后通过上述扩展方法访问视图中的索赔。我最近写了一篇关于类似场景的博文——你可以去那里看看,以更深入地了解索赔是如何工作的。