【问题标题】:How to use Bootstrap modal in Blazor client app?如何在 Blazor 客户端应用程序中使用 Bootstrap 模式?
【发布时间】:2020-04-03 00:34:38
【问题描述】:

我正在尝试显示引导模式,然后绑定其按钮。但我无法通过显示模态的第一步。我正在使用 .net core 3.1 的 Blazor 客户端模板。我有一个名为 Modal.razor 的页面,其中包含我从 getbootstrap.com 找到的引导模式。

@if (Show)
{
    <div class="modal" tabindex="-1" role="dialog">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title">Modal title</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <p>Modal body text goes here.</p>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-primary">Save changes</button>
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>
}
@code {
    [Parameter]
    public bool Show { get; set; } = false;
}

我在 index.razor 文件中调用了模态

@page "/"

<button @onclick="(()=>switchModal=!switchModal)">Switch Modal</button>

<Modal Show="switchModal"/>

@code{
    bool switchModal = false;
}

你可能会说 StateHasChanged 应该在这里被调用。但即使我将模态代码复制并粘贴到 index.razor 中,我也看不到任何内容。

【问题讨论】:

标签: razor .net-core blazor blazor-client-side


【解决方案1】:

可能有更好的方法来做到这一点,但这里有一个可以帮助您入门的工作示例:

页面:

@page "/modal-test"

<BlazorApp1.Components.Modal @ref="Modal"></BlazorApp1.Components.Modal>

<button @onclick="() => Modal.Open()">Open Modal</button>

@code {
    private BlazorApp1.Components.Modal Modal { get; set; }
}

组件:

<div class="modal @ModalClass" tabindex="-1" role="dialog" style="display:@ModalDisplay">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Modal title</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <p>Modal body text goes here.</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-primary">Save changes</button>
                <button type="button" class="btn btn-secondary" data-dismiss="modal" @onclick="() => Close()">Close</button>
            </div>
        </div>
    </div>
</div>


@if (ShowBackdrop)
{
    <div class="modal-backdrop fade show"></div>
}


@code {


  public Guid Guid = Guid.NewGuid();
    public string ModalDisplay = "none;";
    public string ModalClass = "";
    public bool ShowBackdrop = false;

    public void Open()
    {
        ModalDisplay = "block;";
        ModalClass = "Show";
        ShowBackdrop = true;
        StateHasChanged();
    }

    public void Close()
    {
        ModalDisplay = "none";
        ModalClass = "";
        ShowBackdrop = false;
        StateHasChanged();
    }
}

另一种解决方法是使用 JSInterop 调用 $('#modalId').modal()

您可以通过执行以下操作让组件的每个版本都有一个唯一的 ID: &lt;div id="bootstrap-modal-@Guid" 然后使用保存的 ID 用 jQuery 调用 .modal()。

【讨论】:

  • 太好了,效果很好。你知道如何使除模态窗口以外的背景变暗吗?
  • @Sorush 我更新了我的答案来解决这个问题。 Bootstrap 4 看起来像是在模态框后面添加了一个&lt;div class="modal-backdrop fade show"&gt;&lt;/div&gt; 来变暗,所以我使用了一个布尔值来显示或隐藏它。
  • 很好,但不适用于fade 类,为什么要使用Guid?我的意思是public Guid Guid = Guid.NewGuid();
  • 我的意思是你的代码没有检测到fadecss 类不工作动画,如果使用大的Model 不工作滚动
  • @ZanyarJ.Ahmed 你找到解决为什么fade类没有使用了吗?
【解决方案2】:

基于 Kyle 的回答,这是我对 Blazor 的第一次实验:使模态对话框组件采用任何标记或组件。

Modal.razor

<div class="modal @modalClass" tabindex="-1" role="dialog" style="display:@modalDisplay; overflow-y: auto;">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">@Title</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close" @onclick="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                @Body
            </div>
            <div class="modal-footer">
                @Footer
            </div>
        </div>
    </div>
</div>

@if (showBackdrop)
{
    <div class="modal-backdrop fade show"></div>
}

@code {
    [Parameter]
    public RenderFragment Title { get; set; }

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

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

    private string modalDisplay = "none;";
    private string modalClass = "";
    private bool showBackdrop = false;

    public void Open()
    {
        modalDisplay = "block;";
        modalClass = "show";
        showBackdrop = true;
    }

    public void Close()
    {
        modalDisplay = "none";
        modalClass = "";
        showBackdrop = false;
    }
}

Index.razor

@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.
<button class="btn btn-primary" @onclick="() => modal.Open()">Modal!</button>

<Modal @ref="modal">
    <Title>This is a <em>Title!</em></Title>
    <Body>
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Omnes enim iucundum motum, quo sensus hilaretur.
            <i>Quis istud possit, inquit, negare?</i>
            <mark>Ego vero isti, inquam, permitto.</mark> Duo Reges: constructio interrete.
        </p>
        <FetchData />
        <dl>
            <dt><dfn>Stoici scilicet.</dfn></dt>
            <dd>An hoc usque quaque, aliter in vita?</dd>
            <dt><dfn>Erat enim Polemonis.</dfn></dt>
            <dd>Quod cum accidisset ut alter alterum necopinato videremus, surrexit statim.</dd>
        </dl>
    </Body>
    <Footer>
        <button type="button" class="btn btn-primary">Save changes</button>
        <button type="button" class="btn btn-secondary" data-dismiss="modal" @onclick="() => modal.Close()">Close</button>
    </Footer>
</Modal>

@code {
    private Modal modal { get; set; }
}

【讨论】:

  • 淡入淡出效果在这里也不起作用 - 你有什么解决办法吗?
  • 什么是 FetchData?
  • @JensMander:FetchData 是默认的 Razor 组件,它显示带有 WeatherForecast 的表。我想它只是为了测试
  • @grammophone,如何获取整个页面的模态对话框,当我从选项卡内部启动模态对话框时,它不是整个页面的模态对话框,它只在选项卡上。喜欢这里:[1]:i.stack.imgur.com/Cu9Es.png
  • 我可以通过将模式添加为页面的一部分并将其作为参数传递给另一个组件来解决问题。
【解决方案3】:

同样基于 Kyle 的回答,如果您在显示和类调整之间放置一小段延迟,则可以维持引导淡入淡出效果

@code {

    ...

    public async Task OpenModal()
    {
        ModalDisplay = "block;";
        await Task.Delay(100);//Delay allows bootstrap to perform nice fade animation
        ModalClass = "show";
        StateHasChanged();
    }

    public async Task CloseModal()
    {
        ModalClass = "";
        await Task.Delay(250);
        ModalDisplay = "none;";
        StateHasChanged();
    }
}

我也将 ModalClass 和 ModalDisplay 变量应用于背景元素

<div class="modal-backdrop fade @ModalClass" style="display: @ModalDisplay"></div>

我相信 bootstrap 可以更好地识别以这种方式触发动画的状态变化

【讨论】:

    【解决方案4】:

    对于背景阴影只添加淡入淡出类:

    <div class="modal fade @ModalClass" tabindex="-1" role="dialog" 
         style="display:@ModalDisplay">
    

    【讨论】:

      【解决方案5】:

      Kyle 的组件运行良好,但有谁知道如何使用 jqueryUi draggable()/resizeable() 函数将可拖动和可调整大小的功能添加到引导模式?

      我有一个纯 javascript 解决方案的链接:DRAG AND RESIZE BOOTSTRAP MODAL,它本质上调用模态 div 上的可调整大小和可拖动的函数

      <script src="https://code.jquery.com/ui/1.11.3/jquery-ui.min.js"></script>
      <script type="text/javascript">
          $('.modal-content').resizable({
              //alsoResize: ".modal-dialog",
              minHeight: 300,
              minWidth: 300
          });
          $('.modal-dialog').draggable();
      </script>
      

      我已尝试将此脚本添加到我的 _Host.cshtml 页面,但没有任何效果。任何关于如何做到这一点的建议将不胜感激......

      大卫

      已更新答案

      答案是在 OnAfterRenderAsync 覆盖中显式调用 javascript 函数以将 JQuery UI 函数应用于模态 div。

      例如

          protected override async Task OnAfterRenderAsync(bool firstRender)
          {
              await jsRuntime.InvokeVoidAsync("setModalDraggableAndResizable");
              await base.OnAfterRenderAsync(firstRender);
          }
      

      其中setModalDraggableAndResizable 是_Hosts.cshtml 中的一个javascript 函数:

          <script src="https://code.jquery.com/ui/1.11.3/jquery-ui.min.js"></script>
          <script type="text/javascript">
              function setModalDraggableAndResizable() {
                  $('.modal-content').resizable({
                      //alsoResize: ".modal-dialog",
                      minHeight: 300,
                      minWidth: 300
                  });
                  $('.modal-dialog').draggable();
              }
          </script>
      
      

      模态现在可以拖动和调整大小...

      Modal example image

      【讨论】:

        【解决方案6】:

        使用 Kyle 解决方案,当我点击背景时,我的对话框不会关闭。

        我看到是z-index的问题:modal div的z-index是1050,背景div是1040,这样我就无法点击背景了。

        我已将对话框 div 内的背景移动并添加到模态对话框 div z-index &gt; 1040 (ES: 1055)

        我还在背景 div 中添加了 data-dismiss="modal" @onclick="() =&gt; Close()",现在它和“关闭”按钮一样有效。

        <div class="modal @ModalClass" tabindex="-1" role="dialog" style="display:@ModalDisplay">
        
            <div class="modal-dialog" role="document" style="z-index:1055">
               ...
            </div>    
        
        @if (ShowBackdrop)
        {
            <div class="modal-backdrop fade show"  data-dismiss="modal" @onclick="() => Close()"></div>
        }
        
        </div>
        

        【讨论】:

          猜你喜欢
          • 2020-12-18
          • 1970-01-01
          • 2021-04-05
          • 2020-05-17
          • 2019-12-12
          • 2021-11-14
          • 2021-04-16
          • 2020-09-06
          • 1970-01-01
          相关资源
          最近更新 更多