是否可以在 Bootstrap Modal 主体中动态加载现有页面

2023-12-28

我是 Blazor 新手,现在正在从事 Blazor WebAssembly 项目。 我有几个剃刀页面,其中有一个表,我在其中显示来自 SQL 的数据。当我单击其中一个表行时,它会打开一个页面,我可以在其中执行 CRUD 操作。

现在,我不需要打开页面来执行 CRUD 操作,而是需要打开 bootstarp 模式并执行 CRUD 操作。 我正在做一个通用的 ModalComponent,其中有模态的页眉和页脚。 是否可以动态加载模型主体,在本例中它将是我已经完成的 CRUD 操作页面?


下面的代码演示了如何实现通用模式对话框,即您想要在模式模式下显示的任何组件/页面的包装器。具体实施IModalDialog展示如何实现 Bootstrap 版本。

我使用的是一个更复杂的版本。我的编辑/查看组件被编写为在模式或全页模式下运行。

支持课程

前三个支持类是不言而喻的:

public class ModalResult
{
    public ModalResultType ResultType { get; private set; } = ModalResultType.NoSet;

    // Whatever object you wish to pass back
    public object? Data { get; set; } = null;

    // A set of static methods to build a BootstrapModalResult
    public static ModalResult OK() => new ModalResult() { ResultType = ModalResultType.OK };
    public static ModalResult Exit() => new ModalResult() { ResultType = ModalResultType.Exit };
    public static ModalResult Cancel() => new ModalResult() { ResultType = ModalResultType.Cancel };
    public static ModalResult OK(object data) => new ModalResult() { Data = data, ResultType = ModalResultType.OK };
    public static ModalResult Exit(object data) => new ModalResult() { Data = data, ResultType = ModalResultType.Exit };
    public static ModalResult Cancel(object data) => new ModalResult() { Data = data, ResultType = ModalResultType.Cancel };
}
public class ModalOptions
{
    // Whatever data you want to pass
    // my complex version uses a <string, object> dictionary
}

public enum ModalResultType
{
    NoSet,
    OK,
    Cancel,
    Exit
}

IModalDialog界面

现在是模式对话框Interface.

using Microsoft.AspNetCore.Components;

public interface IModalDialog
{
    ModalOptions Options { get; }

    //  Method to display a Modal Dialog
    Task<ModalResult> ShowAsync<TModal>(ModalOptions options) where TModal : IComponent;

    // Method to update the Modal Dialog during display
    void Update(ModalOptions? options = null);

    // Method to dismiss - normally called by the dismiss button in the header bar
    void Dismiss();

    // Method to close the dialog - normally called by the child component TModal
    void Close(ModalResult result);
}

基本引导程序实现

  1. 没有JS啊
  2. I use a TaskCompletionSource使打开/关闭成为异步过程。
  3. 要显示的组件作为 open 调用的一部分传递。
@inherits ComponentBase
@implements IModalDialog

@if (this.Display)
{
    <CascadingValue Value="(IModalDialog)this">
        <div class="modal" tabindex="-1" style="display:block;">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">Modal title</h5>
                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" @onclick="() => Close(ModalResult.Exit())"></button>
                    </div>
                    <div class="modal-body">
                        @this.Content
                    </div>
                </div>
            </div>
        </div>
    </CascadingValue>
}
@code {
    public ModalOptions Options { get; protected set; } = new ModalOptions();
    public bool Display { get; protected set; }
    protected RenderFragment? Content { get; set; }

    protected TaskCompletionSource<ModalResult> _ModalTask { get; set; } = new TaskCompletionSource<ModalResult>();

    public Task<ModalResult> ShowAsync<TModal>(ModalOptions options) where TModal : IComponent
    {
        this.Options = options ??= this.Options;
        this._ModalTask = new TaskCompletionSource<ModalResult>();
        this.Content = new RenderFragment(builder =>
        {
            builder.OpenComponent(1, typeof(TModal));
            builder.CloseComponent();
        });
        this.Display = true;
        InvokeAsync(StateHasChanged);
        return this._ModalTask.Task;
    }

    public void Update(ModalOptions? options = null)
    {
        this.Options = options ??= this.Options;
        InvokeAsync(StateHasChanged);
    }

    public async void Dismiss()
    {
        _ = this._ModalTask.TrySetResult(ModalResult.Cancel());
        this.Display = false;
        this.Content = null;
        await InvokeAsync(StateHasChanged);
    }

    public async void Close(ModalResult result)
    {
        _ = this._ModalTask.TrySetResult(result);
        this.Display = false;
        this.Content = null;
        await InvokeAsync(StateHasChanged);
    }
}

Demo

一个简单的“编辑”组件:

@inject NavigationManager NavManager

<h3>EditForm</h3>
<div class="p-3">
    <button class="btn btn-success" @onclick=Close>Close</button>
</div>

@code {
    [CascadingParameter] private IModalDialog? modal { get; set; }

    private void Close()
    {
        if (modal is not null)
            modal.Close(ModalResult.OK());
        else
            this.NavManager.NavigateTo("/");
    }
}

和一个测试页面:

@page "/"

<div class="p-2">
    <button class="btn btn-primary" @onclick=OpenDialog>Click</button>
</div>

<div class="p-2">
    result: @Value
</div>

<ModalDialog @ref=this.modal />

@code {
    private string Value { get; set; } = "Fred";

    private IModalDialog? modal;
    private IModalDialog Modal => modal!;

    private async void OpenDialog()
    {
        var options = new ModalOptions();
        var ret = await Modal.ShowAsync<EditorForm>(new ModalOptions());
        if (ret is not null)
        {
            Value = ret.ResultType.ToString();
        }
        StateHasChanged();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Bootstrap Modal 主体中动态加载现有页面 的相关文章

随机推荐

  • Flask登录成功后如何重定向到上一页

    我有一个网络应用程序 我不使用 Flask 登录 如果用户访问链接但未登录 我会将用户重定向到登录页面 我在会话中设置 用户名 并检查当用户尝试直接访问某些链接而不登录时 即在这种情况下用户名将为空 我尝试遵循这个二氧化硫溶液 https
  • 如何为 Angular 2 安装和导入 paperjs?

    我尝试使用命令安装 paperjs sudo npm install paper 在我的角度应用程序文件夹中 纸张似乎出现在 node modules 文件夹中 但是当我尝试使用导入它时 import Paper from paper 它没
  • 检查触发器是否存在

    我对公共模式中所有表的触发器有以下查询 SELECT CREATE TRIGGER tab name if modified trg INSERT OR UPDATE OR DELETE ON tab name FOR EACH ROW E
  • Angular 使用变量或循环创建选择器标签

    我需要使用变量创建 app component html 的选择器标签 假设变量名称为 componentVar string 我需要我的 app component html
  • 如何为 Azure 中的每个分支设置不同的管道

    我有一个项目 但有两个 主 分支 master 虚拟 主控 他们每个人都会有自己的azure pipeline yml具体针对他们的分支机构 第一条管道在master触发器设置为 trigger batch true branches in
  • 返回花括号在 javascript 中意味着什么(例如 return { init : init} )[重复]

    这个问题在这里已经有答案了 我正在查看这段代码 function var sidescroll function init function STUFF return init init What does this do sidescro
  • 以编程方式创建 UITextField 事件

    我在创建行时以编程方式将文本字段添加到 TableView 中 我试图通过这样做来订阅这些文本字段的 TouchUpInside 事件 UITextField eTextField UITextField alloc initWithFra
  • Android 垃圾收集器是否会在运行时暂停其他应用程序?

    我发现一些关于 Android 垃圾收集器的信息与我矛盾 Android 开发者指南 说道 Android 3 0 是该平台的第一个版本 旨在运行于 单核或多核处理器架构 各种各样 Dalvik VM Bionic 库和其他地方的更改增加了
  • Clang 融合乘加取决于表达式参数的恒定性

    正如答案中所示clang 14 0 0 浮点优化 https stackoverflow com questions 73985098 clang 14 0 0 floating point optimizations 自版本 14 起 C
  • 使用 Cython 优化 NumPy

    我目前正在尝试优化我用纯Python编写的代码 这段代码使用NumPy http en wikipedia org wiki NumPy当我使用 NumPy 数组时 工作量非常大 下面你可以看到我转换成的最简单的课程Cython http
  • 多个 join 语句未返回预期结果

    我必须编写一个具有以下要求的查询 查询应该返回所有的列表 名为的客户的条目值 Steve 以及显示的每个日期 如果 可用 的最新状态详细信息 那个日期 顾客表 CustomerID CustomerName 1 Steve 2 John 参
  • 材料日期选择器中的奇怪行为

    我正在尝试使用物化日期选择器 http materializecss com forms html http materializecss com forms html 这样 我想在单击图标时弹出日期选择器 我已经实现了两种实现 其中两者之
  • 使用 C# 将行添加到 Word 文档 [重复]

    这个问题在这里已经有答案了 我使用 C 在 Word 文档中创建了一个表 我试图将行添加到表的末尾 现在我有 4 行的表 我尝试这样添加 int rowIndex 1 this Tables 1 Rows Add this Tables 1
  • 如何使用 CSS 或 jquery 使链接不可点击? [复制]

    这个问题在这里已经有答案了 我有以下 HTML ul class static li class static dynamic children a class static dynamic children menu item href
  • 提示用户输入信息,然后对数据进行排序

    对于一个班级项目 我需要用 Javascript 创建一个程序 要求用户输入 3 个名称 然后按字母顺序对名称进行排序并将其打印在屏幕上 我已经弄清楚如何创建一个提示框供用户输入数据 并且我可以让程序将用户输入的字符串打印到屏幕上 但是 我
  • 如何在 SQLite 中创建数据库并添加 2 个表

    我正在使用 SQLite ADO NET 提供程序 我想通过 vb net 中的代码创建一个包含 2 个表的数据库 请提供相同的代码 我正在使用 VS 2010 Winforms 在 XP SP3 Pro 下工作 使用 SQLiteConn
  • Go 中语义注释有什么用?

    类推这个问题 https stackoverflow com questions 10858787 what are the uses for tags in go关于标签 我注意到除了纯粹的评论之外 评论还有多种用途 例子 去 生成 ht
  • 红宝石块内的赛璐珞异步不起作用

    尝试实现赛璐珞async在我的工作示例中似乎表现出奇怪的行为 这是我的代码 class Indefinite include Celluloid def run loop do 1 each do i async on background
  • 将不规则定位的数据插值到

    我正在尝试显示彩色表面爪哇世界风 http worldwind arc nasa gov java 其中颜色取决于一组不规则定位数据中的纬度 经度定位值 例如温度 我正在使用中找到的示例gov nasa worldwindx example
  • 是否可以在 Bootstrap Modal 主体中动态加载现有页面

    我是 Blazor 新手 现在正在从事 Blazor WebAssembly 项目 我有几个剃刀页面 其中有一个表 我在其中显示来自 SQL 的数据 当我单击其中一个表行时 它会打开一个页面 我可以在其中执行 CRUD 操作 现在 我不需要