我相信我所做的是反對dotnet-8-Blazor-way做事,但我無論如何都會發(fā)帖,因為我覺得如果有更多的人在.NET 7之前做過我所做過的事情,這對他們來說會很有用。
目前(在.NET 8 RC1之前),我有一個頁面,其中必須從C#打開bootstrap模態(tài)。為此,我在JS文件上添加了兩個方法(openPOModal、closePOModal),并使用JSInterop從C#調(diào)用它們:
JS:
var selectPOModal = new bootstrap.Modal('#selectPOModal', {
});
var closePOModal = () => {
selectPOModal.hide();
}
var openPOModal = () => {
selectPOModal.show();
}
export { closePOModal, openPOModal };
Razor component:
@code {
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
jsModule = await JS.InvokeAsync<IJSObjectReference>(
"import", "./Pages/MyComponent.razor.js");
}
}
...
private async Task SomethingHappensNeedOpenModal()
{
await jsModule.InvokeVoidAsync("openPOModal");
}
}
即使在.NET 8 RC2中,模態(tài)也會打開,但模態(tài)中所有Blazor控制的元素都不再響應(yīng)。
我在模態(tài)中有一個綁定到屬性的輸入,它不再更新。也不是我調(diào)用C#方法的按鈕。
我的問題是:有沒有一種簡單的方法可以使用JS再次實現(xiàn)這一點?
或者,使用Blazor實現(xiàn)bootstrap's打開/關(guān)閉邏輯的正確解決方案是這個鏈接問題的答案中所做的嗎?
我在Blazor.NET 8 RC2(服務(wù)器)中處理此問題的方法是向窗口添加一個可以通過JS interop調(diào)用的函數(shù)。
首先,在加載時運行的JS文件中創(chuàng)建函數(shù)(在本例中使用IIFE)。
my-bootstrap.js
創(chuàng)建包含模態(tài)和事件處理程序的剃刀組件,以通過IJSRuntime顯示模態(tài)。在這種情況下,我使用的是按鈕點擊。
my-modal.razor
我在這里包含了一個按鈕,只是為了演示——您可以以一種對您有意義的方式連接到邏輯中。
Edit
事件處理程序在模態(tài)內(nèi)部工作的示例:
值得一提的是,我使用的是Bootstrap v.3.2。