c# - 使用 IJSRuntime 在 blazor 中包装引导模式

标签 c# bootstrap-modal blazor

是否可以通过 IJSRuntime 获取对 Bootstrap 5 bootstrap.Modal 的引用并保存对该实例的引用以供以后使用?

例子:

我可以用这个方法显示模态:

await _jsRuntime.InvokeVoidAsync("eval", $"new bootstrap.Modal(document.getElementById('myId')).show()");

但我不能以同样的方式隐藏它,因为我需要存储对 new bootstrap.Modal 创建的引用。我怎样才能动态地做到这一点(我有一个引导模式组件)而不必编写 javascript?有没有什么方法可以保存变量并稍后通过 IJSRuntime 引用它们?

最佳答案

经过大量搜索,我发现 eval 永远不是解决方案。我不是 JavaScript 开发人员,但我把它放在一起:

BootstrapModal.razor

@inject IJSRuntime _jsRuntime;

<div class="modal fade" id="@Id" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
            @ChildContent
        </div>
    </div>
</div>

@code {
    [Parameter]
    public string Id { get; set; }

    [Parameter]
    public RenderFragment ChildContent { get; set; }

    public dynamic Parameter { get; private set; }

    protected override void OnInitialized()
    {
        if (string.IsNullOrEmpty(Id))
        {
            Id = Guid.NewGuid().ToString();
        }
    }

    public async Task Show(dynamic parameter = null)
    {
        Parameter = parameter;

        await _jsRuntime.InvokeVoidAsync("BootstrapModal.ShowModal", Id);
    }

    public async Task Hide()
    {
        await _jsRuntime.InvokeVoidAsync("BootstrapModal.HideModal");
    }
}

BootstrapModalInterop.js

window.BootstrapModal = {};
window.BootstrapModal.OpenedModal = null;

window.BootstrapModal.ShowModal = (id) => {
    if (window.BootstrapModal.OpenedModal != null) {
        window.BootstrapModal.HideModal();
    }

    window.BootstrapModal.OpenedModal = new bootstrap.Modal(document.getElementById(id));
    window.BootstrapModal.OpenedModal.show();
}

window.BootstrapModal.HideModal = () => {
    if (window.BootstrapModal.OpenedModal == null) {
        return;
    }

    window.BootstrapModal.OpenedModal.hide();
    window.BootstrapModal.OpenedModal = null;
}

确保从主机文件中引用 BootstrapModalInterop.js 文件。

您现在可以从 Blazor 代码以 native 方式打开和关闭模式。

示例用法:

...
<button class="btn btn-danger" @onclick="async () => await _deleteModal.Show(discountCode.Id)"><i class="fas fa-trash"></i></button>
...

<BootstrapModal @ref="_deleteModal">
    <div class="modal-header">
        <h5 class="modal-title">
            Delete Discount Code
        </h5>
    </div>
    <div class="modal-body">
        <p>
            Are you sure that you want to delete this discount code? This cannot be undone!
        </p>
    </div>
    <div class="modal-footer">
        <button @onclick="async () => await _deleteModal.Hide()" class="btn btn-secondary">Close</button>
        <button @onclick="async () => await Delete((int)_deleteModal.Parameter)" class="btn btn-outline-danger">Delete</button>
    </div>
</BootstrapModal>

@code 
{
  private BootstrapModal _deleteModal;
}

参数属性是可选的,但我用它来解析我想用它删除的项目的 ID。稍后我可以使用 (int)_deleteModal.Parameter 获取此 ID。我选择了 dynamic 类型,这样我就可以解析任何内容。

关于c# - 使用 IJSRuntime 在 blazor 中包装引导模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67570217/

相关文章:

c# - 你能在 C# 中找到 Active Directory 用户的主要组吗?

javascript - 单击 chart.js 中的各个栏时如何显示 Bootstrap 模式

javascript - Angular 中的模态不起作用。未处理的拒绝 {}

c# - Blazor AD 身份验证安全句柄已关闭

c# - 如何在没有 WPF 的情况下将 ProgressBar 嵌入到 ListView 中?

C# 比较数组中的值是否找到 SQL 表

c# - 在选择更改事件上禁用事件冒泡 - WPF

javascript - 多个日期选择器不工作

Blazor 和浏览器页面刷新

asp.net-core - 事件为 : Cannot convert lambda expression to intended delegate type 的代码中的 Blazor 可重用 RenderFragments