我有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
。要执行此操作,请在解决方案资源管理器中右键单击该文件->属性(在末尾(
完成这些新步骤后,它似乎运行良好。我希望它能帮助到别人。