Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET Core 2.1基于数据库中的数据在布局中插入CSS_Css_Asp.net Core - Fatal编程技术网

ASP.NET Core 2.1基于数据库中的数据在布局中插入CSS

ASP.NET Core 2.1基于数据库中的数据在布局中插入CSS,css,asp.net-core,Css,Asp.net Core,我有一个我正在努力解决的问题。一些背景:用户可以在我的应用程序中选择应用程序要使用的配色方案,此选择存储在数据库中 我想做的是基于这个选择,在页面加载时,为用户做出的选择提供CSS文件 我一直试图通过在_Layout.cshtml页面中执行AJAX请求,并在标题中添加适当的CSS来检查用户的选择。这是可行的,但不是很好,因为有一些延迟,这不是一个好的解决方案,因为在CSS加载后,有时元素的一些样式是不正确的 我想做的是检查服务器端,就像控制器中的普通视图一样(布局页面缺少控制器,正如您所知,这就

我有一个我正在努力解决的问题。一些背景:用户可以在我的应用程序中选择应用程序要使用的配色方案,此选择存储在数据库中

我想做的是基于这个选择,在页面加载时,为用户做出的选择提供CSS文件

我一直试图通过在_Layout.cshtml页面中执行AJAX请求,并在标题中添加适当的CSS来检查用户的选择。这是可行的,但不是很好,因为有一些延迟,这不是一个好的解决方案,因为在CSS加载后,有时元素的一些样式是不正确的

我想做的是检查服务器端,就像控制器中的普通视图一样(布局页面缺少控制器,正如您所知,这就是我遇到的问题)。然后在_布局视图中添加正确的CSS

所以亲爱的堆栈溢出者,你有什么建议给我如何实现这一点?我的用户需要那种甜蜜的黑暗主题

提前谢谢

如果您只是有一个“暗”和“亮”主题,为什么不在存储用户选择的数据库中存储bool,然后在视图的
\u布局中执行类似操作

@if(ViewBag.IsLightTheme)
{
    <link rel="stylesheet"  type="text/css" href="path.to.light.theme" />
}

else
{
    <link rel="stylesheet"  type="text/css" href="path.to.dark.theme" />
}
@if(ViewBag.IsLightTheme)
{
}
其他的
{
}
在控制器的构造函数中,您需要将来自数据库的值分配给
ViewBag.IsLightTheme
var(您可能希望在那里使用某种形式的缓存,因为这将在每个页面上调用)

如果您不只是有两个主题,您可以使用一种更精细的方法,根据
开关
或类似的东西选择要编写的
href

另一种选择是始终为CSS使用相同的URL,该URL实际上指向一个控制器的操作,该控制器将执行对数据库的调用,并使用
return Content()

创建一个服务,根据回答返回不同的CSS

public class ThemeService
{
    private readonly MyDbContext  _dbContext;
    private readonly IMemoryCache _memoryCache;

    public ThemeService(MyDbContext dbContext, IMemoryCache memoryCache)
    {
        //Here you can also inject the UserManager<T> if needed
        _dbContext = dbContext;
        _memoryCache = memoryCache;
    }

    public string GetTheme()
    {
        throw new NotImplementedException();
    }
}
在你看来,只需注入它

@inject ThemeService ThemeService;
后来在视图中:

<link type="text/css" href="@ThemeService.GetTheme()" />


是的,对于连接到控制器的普通视图,我会这样做,但由于布局视图缺少控制器,我不确定这是否可行?这与MVC5类似。布局的“控制器”实际上是使用布局的视图的控制器操作。但这是.net核心!这意味着您实际上可以在视图中插入模型。。。在您的
\u布局中
。现在可能是使用此功能的适当时机。您还可以使用html标记帮助程序或组件来获得更清晰的语法,而不是使用这些脏的
(如果我建议的话)
)。。。(netcore 2太棒了,现在就用吧!)非常感谢Wndrr,您和一位来自C#discord频道的用户都提出了这个建议,所以我实现了它,它工作得很好。既然Christian在下面写了一个答案来解释我是如何做到的,我会将他的帖子标记为已接受的答案,但你们都给了我正确的方向,我为此感谢你们!)我只是回来写一篇关于我如何解决这个问题的帖子,但没必要了,是你为我写的哈哈。用户“shadow_kras”在Discord C#频道向这个方向发送了消息,还有@Wndrr在这里发送的消息等等。非常感谢,这正是我想要的,现在我可以对我想添加到布局视图中的一些其他内容执行相同的操作。回答得很好!:)@christian Gollhardt感谢您的回答,这对我很有帮助,我想知道当我添加时我的服务是否是异步的,我从布局中调用它,它现在正在工作。你知道我该怎么解决这个问题吗。再次感谢您
等待
他们@wandos?@ChristianGollhardt我试过了,但没用,@{wait ThemeService.GetTheme();}没用我这里没有IDE,但语法不正确@wandos
<link type="text/css" href="@ThemeService.GetTheme()" />