C# Bootstrap 4转盘在Blazor(预览7)服务器端不工作

C# Bootstrap 4转盘在Blazor(预览7)服务器端不工作,c#,bootstrap-4,blazor-server-side,C#,Bootstrap 4,Blazor Server Side,我遵循了将Carousel与Blazor一起使用的解决方案,但在运行应用程序时出现对象异常 _Host.cshtml: <body> <app>@(await Html.RenderComponentAsync<App>())</app> <script src="_framework/blazor.server.js"></script> <script src="https://code

我遵循了将Carousel与Blazor一起使用的解决方案,但在运行应用程序时出现对象异常

_Host.cshtml:

<body>
    <app>@(await Html.RenderComponentAsync<App>())</app>

    <script src="_framework/blazor.server.js"></script>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"
            integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
            crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
            integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
            crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
            integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
            crossorigin="anonymous"></script>
    @*<script src="_framework/blazor.webassembly.js"></script>*@

    <script>
        window.initializeCarousel = () => {
            $('#mycarousel').carousel({ interval: 2000 });

            //see step 2 to understand these news id's:
            $('#mycarousel-prev').click(
                () => $('#mycarousel').carousel('prev'));
            $('#mycarousel-next').click(
                () => $('#mycarousel').carousel('next'));

        }
    </script>
</body>
</html>

Razor Page:

@page "/fullDetails/{id:int}"
@using BlazorApp2.Data
@using System.Collections.Generic
@inject IJSRuntime JsRuntime;
@inject VehicleService VService
@inherits UIAttributes


<h1>Vehicle Details</h1>
<hr />
<div>
    @if (vehicleInfo == null)
    {
        <p><em>Loading...</em></p>
    }
    else
    {
        <div class="col-lg-4 col-md-6 col-sm-6">
            <div id="mycarousel" class="carousel slide" data-ride="carousel">
                <div class="carousel-inner">
                    @foreach (var img in images)
                    {
                        if (img.SeqNo == "1")
                        {
                            <div class="carousel-item active">
                                <img class="d-block w-100" src="/images/@img.ImageName" alt="None">
                            </div>

                        }
                        else
                        {
                            <div class="carousel-item">
                                <img class="d-block w-100" src="/images/@img.ImageName" alt="None">
                            </div>
                        }
                    }
                </div>

                <!-- Left and right controls -->
                <a class="carousel-control-prev" id="mycarousel-prev" data-slide="prev">
                    <span class="carousel-control-prev-icon"></span>
                </a>
                <a class="carousel-control-next" id="mycarousel-next" data-slide="next">
                    <span class="carousel-control-next-icon"></span>
                </a>
            </div>
        </div>



</div>

@*If using @code per new speck you get errors when using this type of format  await _jsRuntime.InvokeAsync<object>("initializeCarousel"); -- where <object> while be seen as markup 08/06/2019*@

@functions{

    VehicleFullDetails vehicleInfo;
    VehicleImage[] images;
    string first { get; set; }

    [Parameter]
    int id { get; set; }


    protected override async Task OnInitAsync()
    {
        vehicleInfo = await VService.OnGetVehicleFullDetailsAsync(id);
        images = vehicleInfo.Images.ToArray();
    }

    private  IJSRuntime _jsRuntime;


    bool firstRender = true;

    protected async override Task OnAfterRenderAsync()
    {
        if (firstRender)
        {

 (line 107)           await _jsRuntime.InvokeAsync<object>("initializeCarousel");
            firstRender = false;
        }
    }



}

@(等待Html.RenderComponentAsync())
@**@
window.initializeCarousel=()=>{
$(#mycarousel')。carousel({interval:2000});
//请参阅步骤2了解这些新闻id:
$(“#mycarousel prev”)。单击(
()=>$('mycarousel')。carousel('prev');
$(“#mycarousel next”)。单击(
()=>$('mycarousel')。carousel('next');
}
剃须刀页面:
@页面“/fullDetails/{id:int}”
@使用BlazorApp2.Data
@使用System.Collections.Generic
@注入IJSRuntime JsRuntime;
@注入车辆服务VService
@继承UIC属性
车辆详情

@如果(车辆信息==null) { 加载

} 其他的 { @foreach(图像中的var img) { 如果(img.SeqNo==“1”) { } 其他的 { } } @*如果使用@code per new speck,则在使用此类格式时会出现错误,请等待_jsRuntime.InvokeAsync(“initializeCarousel”)——其中将被视为标记2019年6月8日*@ @功能{ 车辆详情车辆信息; 车辆图像[]图像; 第一个字符串{get;set;} [参数] int id{get;set;} 受保护的重写异步任务OnInitAsync() { vehicleInfo=等待VService.OnGetVehicleFullDetailsSync(id); images=vehicleInfo.images.ToArray(); } 私有ijsruntimejsu运行时; bool firstRender=true; AfterRenderAsync()上受保护的异步重写任务 { if(firstRender) { (第107行)wait_jsRuntime.InvokeAsync(“initializeCarousel”); firstRender=false; } } }
[2019-08-07T15:51:05.848Z]错误:System.AggregateException:发生一个或多个错误。(对象引用未设置为对象的实例。) --->System.NullReferenceException:对象引用未设置为对象的实例。 在C:\projects\blazor\gettingStarted\BlazorApp2\BlazorApp2\Pages\FullDetails.OnAfterRenderAsync()中的BlazorApp2.Pages.FullDetails.OnAfterRenderAsync()处
---内部异常堆栈末尾跟踪--

JavaScript与Blazor的工作方式与之前与默认Razor页面的工作方式不同,因为服务器端Blazor使用WebAssembly并以二进制格式向用户传输数据

以部分形式传输时,它无法运行

有两种解决问题的方法:

1) -一个是将Blazor从服务器端更改为客户端(这样用户可以下载包含所有脚本的完整页面)

2) -第二个是使用JavaScript互操作如何使用,您可以在官方MS文档中阅读

代码中还存在一些语法错误:

await\u jsRuntime.InvokeAsync(“initializeCarousel”);

但您指的是JS脚本,所以它应该是JS文件,如下所示:


await _jsRuntime.InvokeAsync(“initializeCarousel.js”);

我将脚本放入initCarousel.js文件,并将其添加到_host.cshtml页面。然后我将@function代码修改为:

 bool firstRender = true;

    protected async override Task OnAfterRenderAsync()
    {
        if (firstRender)
        {

            await jsRuntime.InvokeAsync<string>("initializeCarousel");
            firstRender = false;
        }
    }
bool firstRender=true;
AfterRenderAsync()上受保护的异步重写任务
{
if(firstRender)
{
等待jsRuntime.InvokeAsync(“initializeCarousel”);
firstRender=false;
}
}
服务器端应用程序现在循环浏览图像,并允许下一个/上一个选择


感谢Chris Sainty的澄清:

谢谢,但这是一个服务器端练习。如果我正确阅读了文档,客户端使用web程序集脚本。“服务器端Blazor使用WebAssembly”是根本错误的。Blazor WebAssembly(也称为客户端Blazor)使用web组件。服务器端blazor在客户端使用一个小java脚本。-值得投反对票