Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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/2/csharp/323.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
Javascript Blazor WebAssembly为特定环境加载不同的脚本_Javascript_C#_Asp.net Core_Blazor_Webassembly - Fatal编程技术网

Javascript Blazor WebAssembly为特定环境加载不同的脚本

Javascript Blazor WebAssembly为特定环境加载不同的脚本,javascript,c#,asp.net-core,blazor,webassembly,Javascript,C#,Asp.net Core,Blazor,Webassembly,我目前正在开发一个.NET标准的2.1 Blazor WebAssembly应用程序。我尝试根据环境变量在index.html中包含或排除JavaScript文件 Blazor WebAssembly应用程序不是Asp.NET核心托管的 在.NET Core中,通常有以下示例中所示的环境标记帮助程序: <environment include="Development"> <script src="js/app.js">&

我目前正在开发一个.NET标准的2.1 Blazor WebAssembly应用程序。我尝试根据环境变量在index.html中包含或排除JavaScript文件

Blazor WebAssembly应用程序不是Asp.NET核心托管的

在.NET Core中,通常有以下示例中所示的环境标记帮助程序:

<environment include="Development">
    <script src="js/app.js"></script>
    <script src="js/helpers.js"></script>
</environment>

<environment exclude="Development">
    <script src="js/site.min.js"></script>
</environment>

正如在本问题中已经讨论过的,环境标记帮助程序是服务器端代码,因此在Blazor WASm中不起作用

现在,我试图根据Blazor WebAssembly中的环境变量找到一个包含/排除JavaScript文件的好解决方案

第一个想法与CSS类似,创建一个名为
的组件,在index.html上加载不同的脚本文件,如下所示:

@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment hostEnv
   
@*Check the environment value*@
@if (hostEnv.IsDevelopment())
{
    <script src="js/app.js"></script>
    <script src="js/helpers.js"></script>
}
else
{
    <script src="js/site.min.js"></script>
}

@code {}
@使用Microsoft.AspNetCore.Components.WebAssembly.Hosting
@注入IWebAssemblyHostenv环境hostEnv
@*检查环境值*@
@if(hostEnv.IsDevelopment())
{
}
其他的
{
}
@代码{}
不幸的是,这不起作用,因为Blazor组件(.razor文件)中不允许使用
元素

出现以下错误:脚本元素允许作者在文档中包含动态脚本和数据块。元素不代表用户的内容。。。脚本标记不应放置在组件内部,因为它们无法动态更新。要解决此问题,请将脚本标记移动到'index.html'文件或其他静态位置

如何根据环境变量(即Blazor Webassembly中的开发、生产或登台)加载不同的脚本


您知道如何解决此问题吗?

只需将index.html代码复制到服务器项目中的.cshtml(以下示例中名为BlazorApp.cshtml)中,然后返回到此页面

public void配置(IApplicationBuilder应用程序)
{
...
app.UseEndpoints(端点=>
{
...
endpoints.MapFallbackToPage(“/BlazorApp”);
}
}

并使用
标签更新代码,以符合您的习惯。

请检查中的解决方案(与上面链接的问题相同),这似乎有效

基本上,解决方法是根据解决方案在名为
Head.razor
的新组件中使用此功能:

@inject IWebAssemblyHostEnvironment hostEnv

@if (hostEnv.IsDevelopment())
{
    <title>BlazorWasmApp - In Debug</title>
    <link href="css/debug.css" rel="stylesheet" />
}
else
{
    <title>BlazorWasmApp - Not Debug</title>
    <link href="css/live.css" rel="stylesheet" />
}

谢谢,您是否介意提供一些关于如何“回退”到.cshtml文件的更多信息?index.html位于Blazor WebAssembly(.Net Standard 2.1)的wwwroot文件夹中?谢谢来自mars的agua,这在“ASP.Net Core hosted”中运行得非常好具有服务器和客户端项目的应用程序。不幸的是,在我的情况下,我只能使用客户端项目。我相应地更新了我的问题。您将在静态页面中部署吗?您不需要信号器,它仅对Blazor服务器是必需的。Blazor WASM不依赖于SignalR@azzurro123可能是是,可能不是:)可能还有另一种解决方案可以解决您的问题,我考虑提取每个环境所需的配置,并将appsettings.{Env}.json中存储的良好配置传递给单个脚本。不幸的是,这对元素不起作用,不允许在组件中使用。可以超越错误,但我觉得这不是正确的方法…您不能在组件中使用script元素,这是不允许的,请参见:是的,但问题仍然存在,如何根据Blazor Wasm中launchSettings.json中设置的环境变量加载(javascript)…对不起,我的错,我现在明白你的问题了,因为头部是一个剃刀页面,不允许使用脚本标记。我忽略了你的问题。如果我发现什么,我会回来的。
public static async Task Main(string[] args)
{
    var builder = WebAssemblyHostBuilder.CreateDefault(args);            
    builder.RootComponents.Add<App>("app");

    //Add the Head to root components
    builder.RootComponents.Add<Head>("head");            
            
    builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });           
    await builder.Build().RunAsync();
}