【问题标题】:Pagination/global search in bootstrap table is not working properly in Blazor引导表中的分页/全局搜索在 Blazor 中无法正常工作
【发布时间】:2021-10-23 07:00:40
【问题描述】:

我在我的应用程序中使用bootstrap-table来实现分页、全局搜索等。它是一个使用Blazor framework(.net 5)的单页应用程序。问题是当我运行该应用程序时,它会立即显示一个带有分页、搜索的引导表,但随后它消失并变成了一个常规引导表。

我尝试了什么:

我的索引.razor

@page "/"
@inherits IndexBase

   <div class="container mt-3 mb-3">
   <table class="table table-hover" id="tblCustomers"
          data-toggle="table"
          data-pagination="true"
          data-search="true"
          data-search-align="left"
          data-show-refersh="true"
          data-detail-view="true"
          data-detail-formatter="detailFormatter">
       <thead>
           <tr>
               <th data-field="Id" data-width="18" data-align="center" data-sortable="true">Cust Id</th>
               <th data-field="Name" data-width="18" data-align="center" data-sortable="true">Cust Name</th>
               <th data-field="GId" data-width="18" data-align="center" data-sortable="true">G Id</th>
               <th data-field="AccNo" data-width="18" data-align="center" data-sortable="true">Acc No</th>
               <th data-field="Active" data-width="18" data-align="center" data-sortable="true">Active</th>
               <th data-field="Key" data-width="18" data-align="center" data-sortable="true">Key</th>
               <th data-field="action" data-align="center">Action</th>
           </tr>
       </thead>
       <tbody>
           @if (Customers == null)
           {
               <tr rowspan="10">
                   <td colspan="8" style="text-align:center"> <div class="spinner">
                       <img src="/images/loader.gif" height="60" width="40"/>
                          </div>
                   </td>
               </tr>
           }
           else
               @foreach (var cust in Customers)
               {
                   <tr>
                       <td>@cust.CustomerId</td>
                       <td>@cust.CustomerName</td>
                       <td>@cust.GId</td>
                       <td>@cust.AccNo</td>
                       <td>@cust.IsActive</td>
                       <td>Not available</td>
                       <td>
                           <a href="" class="edit" style="text-decoration:none;" title="edit" @onclick="(()=>OnEdit(cust.CustomerId))" @onclick:preventDefault> <i class="fa fa-edit fa-lg fa-charade"></i></a>
                           <a href="" class="remove" style="text-decoration:none;" title="remove" @onclick="() =>OnDelete(cust)" @onclick:preventDefault> <i class="fa fa-trash fa-lg fa-charade"></i></a>
                       </td>
                   </tr>
               }
       </tbody>

   </table>

</div>

_host.cshtml

@page "/"
@namespace MyBlazorApp.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
    Layout = null;
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>MyBlazorApp</title>
    <base href="~/" />
    <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
    <link href="css/site.css" rel="stylesheet" />
    <link href="MyBlazorApp.styles.css" rel="stylesheet" />
    <link rel="stylesheet" href="~/css/bootstrap/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/font-awesome/css/font-awesome.min.css">
    <link rel="stylesheet" href="~/js/bootstrap-table/bootstrap-table.min.css" />
    <link rel="stylesheet" href="~/css/custom/main.css" />
    <link rel="stylesheet" href="~/css/custom/header.css" />
    <link rel="stylesheet" href="~/css/custom/index.css" />
    <link rel="stylesheet" href="~/css/custom/customer.css" />
    
    <style type="text/css">

        /* width */
        ::-webkit-scrollbar {
            width: 10px;
        }

            ::-webkit-scrollbar:horizontal {
                width: 8px;
            }
        /* Track */
        ::-webkit-scrollbar-track {
            box-shadow: inset 0 0 5px grey;
            border-radius: 5px;
        }

        /* Handle */
        ::-webkit-scrollbar-thumb {
            background: #555;
            border-radius: 5px;
        }

            /* Handle on hover */
            ::-webkit-scrollbar-thumb:hover {
                background: #555;
            }
    </style>

</head>
<body>
    <component type="typeof(App)" render-mode="ServerPrerendered" />

    <div id="blazor-error-ui">
        <environment include="Staging,Production">
            An error has occurred. This application may no longer respond until reloaded.
        </environment>
        <environment include="Development">
            An unhandled exception has occurred. See browser dev tools for details.
        </environment>
        <a href="" class="reload">Reload</a>
        <a class="dismiss">????</a>
    </div>
    <script src="_framework/blazor.server.js"></script>
    <script src="~/js/jquery/jquery-3.6.0.min.js"></script>
    <script src="~/js/popper/popper.min.js"></script>
    <script src="~/js/bootstrap/bootstrap.min.js"></script>
    <script src="~/js/bootstrap-table/bootstrap-table.min.js"></script>
    <script src="~/js/jquery-resizable/dist/jquery.resizableColumns.min.js"></script>
    <script src="~/js/bootstrap-table/extensions/resizable/bootstrap-table-resizable.js"></script>

    <script>
        $(function () {
            $(".search").append('<span><i class="fa fa-search fa-search-custom" aria-hidden="true"></i></span>');
            /* add the span inside search div with append box*/
        })
        function detailFormatter(index, row) {
            //debugger;
            var html = [];
            $.each(row, function (key, value) {
                if (key == 'Id' || key == 'Name' || key == 'AccNo' || key == 'Active') {
                    html.push('<p class="row" style="width:50%;float:right"><b col="col-md-2">' + key + '</b><span class="col-md-10">: ' + value + '</span></p>');
                }
            });
            return html.join('');
        }
       
    </script>
</body>
</html>

我错过了什么?任何帮助将不胜感激。

【问题讨论】:

  • 您能否向我们展示实际的分页代码 - 或者(甚至更好)展示您的问题的工作示例。主要问题是 JS 和 Blazor 相互干扰,但如果不了解您实际在做什么,就很难为您指明正确的方向。
  • 我添加了。谢谢@MrCakaShaunCurtis
  • 您在使用bootstrap-table.com 吗?你能分享你的整个 _Host.cshtml 吗?
  • 您可以将所有 CDN 链接用于引导程序和引导程序表吗? (使用引导程序 4)看看它是否有效?
  • 最初,我是使用 CDN 链接完成的,但问题仍然存在。此外,在硬刷新后它工作正常(使用 CDN 链接)

标签: c# blazor bootstrap-table


【解决方案1】:

我在 Blazor 应用程序中遇到了与 bootstrap-table 相同的问题。我想我找到了解决办法。

由于某种原因,Blazor 在开始时加载 js 脚本,并且似乎 bootstrap-table 加载正确。但加载后,您要应用引导程序的表保持原始样式和状态。我真的不知道为什么,我想这是一种 Blazor 行为。 (我认为我们应该确切地了解 blazor 是如何工作的,才能知道真正的原因)。

无论如何,几周前我应用了一个 pdf 查看器工具,并按照安装说明进行操作。其他工具也是一样的,调用一些js和css文件……但是在我按照Blazor安装步骤的时候,我注意到它们在渲染后做了一种JS运行功能,而不仅仅是导入文件。

所以,在这个解释之后,我可以让 bootstrap-table 工作做以下事情。

  1. 像往常一样将 css 和 js 文件导入 _Host.cshtml 文件(或您用作主文件的文件)。我将引导表文件安装到我的项目中,但我认为它可以与 CDN 一起使用。当然,JS文件就在body标签关闭之前。
    ///CSS FILES
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
    <link rel="stylesheet" href="bootstrap-icons/font/bootstrap-icons.css" />
    <link rel="stylesheet" href="bootstrap-table/bootstrap-table.min.css" />
    
    ///JS FILES
    <script src="jquery/jquery.min.js"></script>
    <script src="bootstrap-table/bootstrap-table.min.js"></script>
  1. 创建一个 js 自定义文件(这将包含在页面呈现后初始化引导表的代码)。并在 bootstrap-table.min.js 引用后添加。
    <script src="js/bootstrapTableScript.js"></script>
  1. 在该文件中写入下一个代码。 (bootstrapTableScript.js 文件)
    window.bootstrapTableFunction = {
        initBootstrapTable: function () {
             $('[data-toggle="table"]').bootstrapTable();
        }
    };
  1. 进入你要插入表格的文件,注入IJSRuntime接口,这样你就可以在Runtime中调用JS函数了
    @inject IJSRuntime JSRuntime
  1. 在同一个 razor 文件中,插入 html 表格代码。我使用了引导页面示例表
    <table data-toggle="table" data-search="true">
         <thead>
             <tr>
                  <th>Item ID</th>
                  <th>Item Name</th>
                  <th>Item Price</th>
             </tr>
        </thead>
        <tbody>
             <tr>
                  <td>1</td>
                  <td>Item 1</td>
                  <td>$1</td>
             </tr>
             <tr>
                  <td>2</td>
                  <td>Item 2</td>
                  <td>$2</td>
             </tr>
        </tbody>
    </table>
  1. 将此代码写入同一个 razor 文件(表格所在的位置)但在代码段内。
    protected override async void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            await JSRuntime.InvokeAsync<object>("bootstrapTableFunction.initBootstrapTable");
        }
    }
  1. 试试吧!它应该工作 This is how you should see

所以,这就是它的工作原理...... OnAfterRender 事件将在剃须刀页面已经呈现时运行。那时,我们将调用一个名为 bootstrapTableFunction 的对象(该对象在您的 bootstrapTableScript 文件中……第 2 步和第 3 步)。该对象有一个名为 initBootstrapTable 的函数,它将初始化将简单表转换为引导表的代码。就是这样!你有你的引导表。

此表格示例应用了搜索功能。因此,如果您想要其他功能,如排序等,您必须在 html 表中添加数据排序和类似的功能,或者如果您想要通过 javascript 在 bootstrapTableScript.js 中添加。就像官方引导表文档所说的那样。

希望这有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多