MVC引导主题



我想在我的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);
}

然后通过上述扩展方法访问视图中的索赔。我最近写了一篇关于类似场景的博文——你可以去那里看看,以更深入地了解索赔是如何工作的。

相关内容

  • 没有找到相关文章

最新更新