旋转皮带扣.AspNetCore+Blazor-在运行时动态添加/删除自定义.css文件



我有Blazor Webassembly ASP。NET Core托管,我安装了Swashbuckle。AspNetCore显示我的Blazor应用程序具有的端点(/swagger端点(
我的Startup.Configure看起来是这样的(只有招摇部分(:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
c.SwaggerEndpoint($"{description.GroupName}/swagger.json", $"v{description.GroupName.ToUpperInvariant()}");
}
c.InjectStylesheet("/css/swaggerDark.css");
});

正如你所看到的,我注入了自定义的.css文件,它是有效的。

在我的Blazor应用程序中,我注入了swagger,所以我的页面看起来像这样(.rarzor页面(:

<iframe src="swagger"/>

同样,它工作正常,招摇文档被显示,它有黑暗的主题。

我注意到(毫不奇怪(这个iframe有一个到这个.css文件的链接:

<link href="/css/swaggerDark.css" rel="stylesheet" media="screen" type="text/css">

删除此链接会带来默认的招摇外观(浅色主题(。

我的应用程序的用户可以选择他想要的整个应用程序的哪个主题(亮/暗(。我的问题是,我如何动态地注入/删除(或者启用/禁用(这个.css文件,以便根据用户选择的应用程序主题,swagger将显示默认(浅色(或深色主题(使用该.css文件(?

我找不到任何关于这个问题的相关信息,所以我决定创建这个问题。我感谢你的帮助。非常感谢。

好吧,我想通了。答案是:使用JsInterop。

我的.剃须刀页面现在看起来是这样的:

@page "/something"
@inject IJSRuntime JS //needed to call InvokeVoidAsync
//I made my own ThemeManager to control the Blazor app theme
@if (ThemeManager.IsDefaultTheme)
{
<iframe id="myiframe" src="swagger" @onload="() => ToggleSwaggerTheme(true)" />
}
else
{
<iframe id="myiframe" src="swagger" @onload="() => ToggleSwaggerTheme(false)" />
}
@code {
private async Task ToggleSwaggerTheme(bool isLight) => await JS.InvokeVoidAsync("toggleSwaggerTheme", isLight);
}

我做到了,所以iframe根据应用程序主题进行切换。ToggleSwaggerTheme函数是不言自明的——我调用JS函数来切换swagger的主题。

index.html中,我添加了一个脚本来加载我的helperFunctions.js(在正文中(,其中可以找到toggleSwaggerTheme函数:

<script src="/js/helperFunctions.js"></script>

我在wwwroot中添加了helperFunctions.js
wwwroot->js->helperFunctions.js

我的helperFunctions.js看起来像这样:

function toggleSwaggerTheme(isLight) {
let myiframe = document.getElementById('myiframe');
let styleSheets = myiframe.contentWindow.document.styleSheets;
for (let i = 0; i < styleSheets.length; i++) {
if (styleSheets[i].href == null) {
continue;
}
if (styleSheets[i].href.includes("/css/swaggerDark.css")) {
styleSheets[i].disabled = isLight;
break;
}
}
}

上面的功能允许我切换招摇主题。请注意,我不知道这是否是可以创建的最佳解决方案。此外,我不确定它在生产环境中会如何表现。如果生产中出现任何问题,我将更新此答案。我希望它能帮助到别人。

上线后更新:

我在上线后显示黑暗主题时遇到了一些问题。但以下内容似乎解决了这个问题:在Program.cs(服务器端(中,在CreateHostBuilder方法中我添加了(不确定是否需要(:

webBuilder.UseStaticWebAssets();

所以在我的情况下,它看起来是这样的:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStaticWebAssets();
webBuilder.UseStartup<Startup>();
});

我还将我的swaggerDark.css文件属性:Copy to Output Directory更改为Copy always。要执行此操作,请在解决方案资源管理器中右键单击该文件->属性(在末尾(
完成这些新步骤后,它似乎运行良好。我希望它能帮助到别人。

最新更新