【问题标题】:MVC Bootstrap ThemesMVC 引导主题
【发布时间】:2014-08-19 13:16:00
【问题描述】:

我想在我的 MVC 5 应用程序中包含对 bootswatch 主题的主题支持。

我希望在用户登录时保存和加载用户主题。

我已扩展我的用户类以包含主题,并且可以在编辑用户页面上成功设置和保存主题。

public class User : IdentityUser
{       
public string BootstrapTheme {get;set;}
}

在 BootstrapTheme 属性中,我将保存引导 css 链接的 href 属性。例如"~/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 将其保存为一页的链接

【问题讨论】:

    标签: asp.net-mvc twitter-bootstrap asp.net-identity owin


    【解决方案1】:

    您应该将主题名称/网址存储为对用户的声明,而不是作为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";
    }
    

    在您看来,您可以像这样访问主题网址:

    <link href="@ClaimsPrincipal.Current.GetThemeUrl()" rel="stylesheet" />
    

    主体声明在 cookie 中可用,因此不需要额外的数据库命中。

    作为替代方案,您可以像您已经做的那样持久化用户 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);
    }
    

    然后通过上述扩展方法访问视图中的声明。我已经 blogged recently 讨论过类似的情况 - 您可以查看那里以更深入地了解索赔的工作原理。

    【讨论】:

    • 谢谢,我会看看基于声明的身份验证。直到现在我一直避免使用它,因为我们的 SharePoint 部门为此抱怨了 2 年 :)
    • 我最近将 2 个 mvc 项目转换为 AspNet Identity 并开始使用声明 - 代码更好,更易于维护!并且性能也得到了提升 - 对 DB 的调用更少!
    • 像魅力一样工作。
    • 需要注意的是,我们需要在 Razor 视图中添加“@using System.Security.Claims”。 (ASP.Net MVC 5 项目)
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多