You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel10 添加司机视图实现带搜索的数据表选择功能

实现带搜索功能的弹窗/隐藏Datatable选择器(Owner & Vehicle)

1. 前端结构设计

先搭建表单核心结构,包含选择触发按钮、选中结果回显区、隐藏域(用于提交ID),以及对应的弹窗/折叠Datatable容器:

<!-- 添加司机表单 -->
<form id="addDriverForm">
  <!-- 车主选择模块 -->
  <div class="form-group">
    <label>所属车主</label>
    <div>
      <button type="button" id="selectOwnerBtn" class="btn btn-primary">选择车主</button>
      <div id="ownerSelected" class="mt-2">未选择</div>
      <input type="hidden" id="ownerId" name="OwnerId">
    </div>
  </div>

  <!-- 车辆选择模块 -->
  <div class="form-group">
    <label>关联车辆</label>
    <div>
      <button type="button" id="selectVehicleBtn" class="btn btn-primary">选择车辆</button>
      <div id="vehicleSelected" class="mt-2">未选择</div>
      <input type="hidden" id="vehicleId" name="VehicleId">
    </div>
  </div>

  <!-- 其他司机信息字段 -->
  <div class="form-group">
    <label>司机姓名</label>
    <input type="text" name="DriverName" class="form-control">
  </div>

  <button type="submit" class="btn btn-success">保存司机</button>
</form>

<!-- 车主选择弹窗 -->
<div class="modal fade" id="ownerModal" tabindex="-1" role="dialog">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="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">
        <table id="ownerDatatable" class="table table-striped" style="width:100%"></table>
      </div>
    </div>
  </div>
</div>

<!-- 车辆选择弹窗 -->
<div class="modal fade" id="vehicleModal" tabindex="-1" role="dialog">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="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">
        <table id="vehicleDatatable" class="table table-striped" style="width:100%"></table>
      </div>
    </div>
  </div>
</div>

2. Datatable初始化与交互逻辑

用jQuery Datatable实现带搜索、分页的列表,绑定行点击事件完成选中回显:

$(document).ready(function() {
  // 初始化车主Datatable
  const ownerTable = $('#ownerDatatable').DataTable({
    ajax: {
      url: '/api/owners', // 后端获取车主列表接口
      type: 'GET',
      dataSrc: ''
    },
    columns: [
      { data: 'Id', title: 'ID' },
      { data: 'Name', title: '车主姓名' },
      { data: 'Phone', title: '联系电话' }
    ],
    searching: true, // 开启内置搜索
    paging: true,
    ordering: true
  });

  // 车主行点击选中逻辑
  $('#ownerDatatable tbody').on('click', 'tr', function() {
    const selectedData = ownerTable.row(this).data();
    $('#ownerSelected').text(`车主:${selectedData.Name}(电话:${selectedData.Phone})`);
    $('#ownerId').val(selectedData.Id);
    $('#ownerModal').modal('hide');
  });

  // 初始化车辆Datatable
  const vehicleTable = $('#vehicleDatatable').DataTable({
    ajax: {
      url: '/api/vehicles', // 后端获取车辆列表接口
      type: 'GET',
      dataSrc: ''
    },
    columns: [
      { data: 'Id', title: '车辆ID' },
      { data: 'PlateNumber', title: '车牌号' },
      { data: 'Model', title: '车型' },
      { data: 'OwnerName', title: '所属车主' }
    ],
    searching: true,
    paging: true,
    ordering: true
  });

  // 车辆行点击选中逻辑
  $('#vehicleDatatable tbody').on('click', 'tr', function() {
    const selectedData = vehicleTable.row(this).data();
    $('#vehicleSelected').text(`车辆:${selectedData.PlateNumber}(${selectedData.Model})`);
    $('#vehicleId').val(selectedData.Id);
    $('#vehicleModal').modal('hide');
  });

  // 弹窗触发按钮绑定
  $('#selectOwnerBtn').click(function() {
    $('#ownerModal').modal('show');
    ownerTable.ajax.reload(); // 每次打开弹窗刷新数据
  });

  $('#selectVehicleBtn').click(function() {
    $('#vehicleModal').modal('show');
    vehicleTable.ajax.reload();
  });

  // 表单提交处理
  $('#addDriverForm').submit(function(e) {
    e.preventDefault();
    const formData = $(this).serialize();
    $.post('/api/drivers', formData, function() {
      alert('司机添加成功');
      $('#addDriverForm')[0].reset();
      $('#ownerSelected').text('未选择');
      $('#vehicleSelected').text('未选择');
    });
  });
});

3. 后端接口核心逻辑

需要提供三个接口,处理数据查询和保存:

  • 车主列表接口:支持分页、搜索过滤
  • 车辆列表接口:同车主列表逻辑
  • 司机保存接口:接收表单数据写入Drivers表

以ASP.NET Core为例的后端代码片段:

// 获取车主列表接口
[HttpGet("api/owners")]
public IActionResult GetOwners(int start, int length, string searchValue)
{
    var query = _context.Owners.AsQueryable();
    if (!string.IsNullOrEmpty(searchValue))
    {
        query = query.Where(o => o.Name.Contains(searchValue) || o.Phone.Contains(searchValue));
    }
    var totalCount = query.Count();
    var data = query.Skip(start).Take(length).ToList();
    return Ok(new { draw = Request.Query["draw"], recordsTotal = totalCount, recordsFiltered = totalCount, data });
}

// 保存司机接口
[HttpPost("api/drivers")]
public IActionResult AddDriver(Driver driver)
{
    if (ModelState.IsValid)
    {
        _context.Drivers.Add(driver);
        _context.SaveChanges();
        return Ok();
    }
    return BadRequest(ModelState);
}

4. 替代方案:折叠式Datatable(非弹窗)

如果不想用弹窗,可将Datatable放在页面隐藏区域,点击按钮切换显示/隐藏:

<!-- 车主选择折叠区域 -->
<div class="form-group">
  <label>所属车主</label>
  <div>
    <button type="button" id="toggleOwnerTable" class="btn btn-primary">选择车主</button>
    <div id="ownerSelected" class="mt-2">未选择</div>
    <input type="hidden" id="ownerId" name="OwnerId">
    <div id="ownerTableContainer" class="mt-3 d-none">
      <table id="ownerDatatable" class="table table-striped" style="width:100%"></table>
    </div>
  </div>
</div>

对应JS切换逻辑:

$('#toggleOwnerTable').click(function() {
  $('#ownerTableContainer').toggleClass('d-none');
  if (!$('#ownerTableContainer').hasClass('d-none')) {
    ownerTable.ajax.reload();
  }
});

内容的提问来源于stack exchange,提问作者Donovan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:17:41