Передача строк не работает между таблицами данных jQuery, которые используют вызов ajax

Я работаю над проектом ASP.NET Core MVC на C#, и у меня есть две таблицы данных jQuery (таблица исключения и таблица включения), выровненные по горизонтали. Между этими двумя таблицами данных есть две кнопки (кнопка со стрелкой вправо и кнопка со стрелкой влево), как показано здесь:

Мне нужно выбрать 1 или несколько строк из таблицы «Исключить», щелкнув строки в ней и нажав кнопку со стрелкой вправо, выбранные строки должны быть перемещены из таблицы «Исключить» в таблицу «Включить» и выполнить ту же операцию, нажав кнопку кнопка со стрелкой влево. То есть перемещение выбранной строки или строк из таблицы «Включить» в таблицу «Исключить». Я использую вызов AJAX для загрузки данных в эти две таблицы.

Обе таблицы данных имеют одну и ту же модель данных.

В Index.cshtml:

@model RowTransfer.Models.DoorDetails
@using System.Data

@{
    ViewData["Title"] = "Index";
}
<script src = "~/js/jquery-2.2.4.min.js"></script>
<script src = "~/js/jquery.datatables.min.js"></script>

<script type = "text/javascript">
$(document).ready(function () {
    LoadGridExclude();
    LoadGridInclude();
});

function LoadGridExclude() {
         new $("#excludeTable").DataTable({
             stripeClasses: [],
             select: {
                 style: 'multi'
             },
        ordering: true,
        paging: false,
        searching: false,
        serverSide: true,
        filter: true,
        searchDelay: 1000,
        scrollCollapse: true,
        ajax: {
            url: '@Url.Action("LoadExclude", "Home")',
            type: 'GET',
            datatype: 'json',
            headers: { 'RequestVerificationToken': 'your json token' },
            data: (d) => {
                return { draw: d.draw, start: d.start, length: d.length, search: d.search.value, FilterByColumn: d.columns[d.order[0].column].data, ASC_DSEC: d.order[0].dir }
            },
            dataSrc: (json) => {
                json = json.data;
                return json;
            }
        },
        columnDefs: [{ className: "dt-center", targets: [1, 2, 3], width: '2%' }],
        columns: [
            { data: 'SiteCode', title: 'SiteCode', autoWidth: true, searchable: true },
            { data: 'LegacyDoor', title: 'Legacy Door', autoWidth: true },
            { data: 'BuyingGroup', title: 'Buying Group', autoWidth: false, orderable: 
             false },
            { data: 'SettingName', title: 'Setting Name', autoWidth: true }
           ]
        });
      }

       function LoadGridInclude() {
                new $("#includeTable").DataTable({
                stripeClasses: [],
                 select: {
                         style: 'multi'
                         },
                 ordering: true,
                 paging: false,
                 searching: false,
                 serverSide: true,
                 filter: true,
                 searchDelay: 1000,
                scrollCollapse: true,
           ajax: {
            url: '@Url.Action("LoadInclude", "Home")',
            type: 'GET',
            datatype: 'json',
            headers: { 'RequestVerificationToken': 'your json token' },
            data: (d) => {
                return { draw: d.draw, start: d.start, length: d.length, search: d.search.value, FilterByColumn: d.columns[d.order[0].column].data, ASC_DSEC: d.order[0].dir }
            },
            dataSrc: (json) => {
                json = json.data;
                return json;
            }
        },
        columnDefs: [{ className: "dt-center", targets: [1, 2, 3], width: '2%' }],
        columns: [
            { data: 'SiteCode', title: 'SiteCode', autoWidth: true, searchable: true },
            { data: 'LegacyDoor', title: 'Legacy Door', autoWidth: true },
            { data: 'BuyingGroup', title: 'Buying Group', autoWidth: false, orderable: 
              false },
            { data: 'SettingName', title: 'Setting Name', autoWidth: true }
           ]
         });
      }

    </script>

       <div style = "vertical-align:top;">
           <table id = "excludeInclude" width=100% style = "vertical-align:top;">
             <tr style = "vertical-align:top;">
              <td valign = "top">
                <table id = "excludeTable" style = "width:100%; height:30%;float:left; 
                 clear:both; vertical-align:top; border:1px solid;"></table>
              </td>
        <td valign = "top" style = "width:5%;float:left; clear:both;margin-left:5px;margin- 
              right:5px; margin-top:95px; ">
            <div id = "btnPanel">
                <button id = "btnRight" class = "btn-logic"><b> >> </b></button>
                <button id = "btnLeft" class = "btn-logic"><b> << </b></button>
            </div>
        </td>
        <td valign = "top">
            <table id = "includeTable" style = "width:100%; height:30%;float:left; 
                   clear:both;vertical-align:top;border:1px solid;"></table>
         </td>
       </tr>
     </table>
    </div>

Здесь показаны методы HomeController:

public IActionResult LoadExclude(int draw = 1, int start = 0, int length = 10, string search = "", string FilterByColumn = "", string ASC_DSEC = "")
{
    List<DoorDetails> excludeDoorList = new List<DoorDetails>();

    DoorDetails eidm1 = new DoorDetails();
    eidm1.LegacyDoor = 43443;
    eidm1.BuyingGroup = "BuyingGroup1";
    eidm1.SiteCode = 11;
    eidm1.SettingName = "Setting1";

    excludeDoorList.Add(eidm1);

    DoorDetails eidm2 = new DoorDetails();
    eidm2.LegacyDoor = 23123;
    eidm2.BuyingGroup = "BuyingGroup2";
    eidm2.SiteCode = 22;
    eidm2.SettingName = "Setting2";

    excludeDoorList.Add(eidm2);

    int recordsTotal = excludeDoorList.Count();

    var jsonData = new { 
                           draw = draw, 
                           recordsFiltered = recordsTotal, 
                           recordsTotal = recordsTotal, 
                           data = excludeDoorList 
                       };

    return OK(jsonData);
}

public IActionResult LoadInclude(int draw = 1, int start = 0, int length = 10, string search = "", string FilterByColumn = "", string ASC_DSEC = "")
{
    List<DoorDetails> includeDoorList = new List<DoorDetails>();

    DoorDetails eidm3 = new DoorDetails();
    eidm3.LegacyDoor = 54483;
    eidm3.BuyingGroup = "BuyingGroup3";
    eidm3.SiteCode = 33;
    eidm3.SettingName = "Setting3";

    includeDoorList.Add(eidm3);

    DoorDetails eidm4 = new DoorDetails();
    eidm4.LegacyDoor = 66543;
    eidm4.BuyingGroup = "BuyingGroup4";
    eidm4.SiteCode = 44;
    eidm4.SettingName = "Setting4";

    includeDoorList.Add(eidm4);

    int recordsTotal = includeDoorList.Count();

    var jsonData = new 
                   { 
                       draw = draw, 
                       recordsFiltered = recordsTotal, 
                       recordsTotal = recordsTotal, 
                       data = includeDoorList 
                   };
    return OK(jsonData);
}

Это класс модели:

public class DoorDetails
{       
    public int SiteCode { get; set; }
    public int LegacyDoor { get; set; }       
    public string BuyingGroup { get; set; }
    public string SettingName { get; set; }      
}

Прямо сейчас я не могу выбирать (одиночные и множественные) строк, щелкая строки обеих таблиц данных и передавая строки между таблицами.

Как это сделать? Пожалуйста, помогите.

Я не вижу ни одного вашего кода, который отправляет выбранные данные из одной таблицы в контроллер, а данные из разных таблиц обновляются. Я думаю, вам нужно рассмотреть возможность хранения данных для таблиц включения/исключения в контроллере, а не жестко закодировать их.

Yong Shun 04.09.2024 02:34

Опция datatables serverSide: true, предназначена не только для начальной загрузки данных, она также используется для разбиения на страницы/сортировки и т. д. Поскольку ваши данные не являются переменными (они жестко запрограммированы в каждой загрузке), они (в настоящее время) не могут быть изменены. измененный. Если намерение состоит в том, чтобы сохранить/сохранить изменения пользователей, начните с сохранения/сохранения исходных данных, а затем их можно будет изменить. Если это интеллектуальный подход (т. е. изучение таблиц данных), удалите serverSide: true, и (предварительно) загрузите свои данные в HTML или через javascript - тогда вы сможете работать чисто на стороне клиента (я не рекомендую это делать, но это то, что у вас есть сейчас). )

fdomn-m 04.09.2024 09:07
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас нет полного маршрута публикации данных, и есть некоторые ошибки. Вот образец, которому вы можете следовать.

DoorService.cs для отправки данных

public interface IDoorService
{
    List<DoorDetails> ExcludeDoors { get; }
    List<DoorDetails> IncludeDoors { get; }
    void MoveToInclude(List<int> ids);
    void MoveToExclude(List<int> ids);
}

public class DoorService : IDoorService
{
    public List<DoorDetails> ExcludeDoors { get; private set; }
    public List<DoorDetails> IncludeDoors { get; private set; }

    public DoorService()
    {
        // Initialize data as you want
        ExcludeDoors = new List<DoorDetails>
        {
            new DoorDetails { SiteCode = 11, LegacyDoor = 43443, BuyingGroup = "BuyingGroup1", SettingName = "Setting1" },
            new DoorDetails { SiteCode = 22, LegacyDoor = 23123, BuyingGroup = "BuyingGroup2", SettingName = "Setting2" }
        };

        IncludeDoors = new List<DoorDetails>
        {
            new DoorDetails { SiteCode = 33, LegacyDoor = 54483, BuyingGroup = "BuyingGroup3", SettingName = "Setting3" },
            new DoorDetails { SiteCode = 44, LegacyDoor = 66543, BuyingGroup = "BuyingGroup4", SettingName = "Setting4" }
        };
    }

    public void MoveToInclude(List<int> ids)
    {
        var doorsToMove = ExcludeDoors.Where(d => ids.Contains(d.SiteCode)).ToList();
        foreach (var door in doorsToMove)
        {
            ExcludeDoors.Remove(door);
            IncludeDoors.Add(door);
        }
    }

    public void MoveToExclude(List<int> ids)
    {
        var doorsToMove = IncludeDoors.Where(d => ids.Contains(d.SiteCode)).ToList();
        foreach (var door in doorsToMove)
        {
            IncludeDoors.Remove(door);
            ExcludeDoors.Add(door);
        }
    }
}

Зарегистрировать услугу

builder.Services.AddSingleton<IDoorService, DoorService>();

Контроллер.cs

public class HomeController : Controller
{
    
    private readonly IDoorService _doorService;

    public HomeController(IDoorService doorService)
    {
        _doorService = doorService;
    }

    public IActionResult LoadExclude(int draw = 1, int start = 0, int length = 10)
    {
        var data = _doorService.ExcludeDoors.Skip(start).Take(length).ToList(); // Pagination logic
        var recordsTotal = _doorService.ExcludeDoors.Count;

        var jsonData = new
        {
            draw = draw,
            recordsFiltered = recordsTotal,
            recordsTotal = recordsTotal,
            data = data
        };

        return Json(jsonData);
    }

    public IActionResult LoadInclude(int draw = 1, int start = 0, int length = 10)
    {
        var data = _doorService.IncludeDoors.Skip(start).Take(length).ToList(); // Pagination logic
        var recordsTotal = _doorService.IncludeDoors.Count;

        var jsonData = new
        {
            draw = draw,
            recordsFiltered = recordsTotal,
            recordsTotal = recordsTotal,
            data = data
        };

        return Json(jsonData);
    }

    [HttpPost]
    public IActionResult MoveToInclude([FromBody] List<int> ids)
    {
        _doorService.MoveToInclude(ids);
        return Ok();
    }

    [HttpPost]
    public IActionResult MoveToExclude([FromBody] List<int> ids)
    {
        _doorService.MoveToExclude(ids);
        return Ok();
    }

    public IActionResult Index()
    {
        return View();
    }

}

Индекс.cshtml

Согласно моему тесту, свойства в столбцах и строках должны быть в нижнем регистре, иначе возникнут ошибки.

@section Scripts {
    <script>
            $(document).ready(function () {
                var excludeTable = LoadGridExclude();
                var includeTable = LoadGridInclude();

                $('#btnRight').click(function () {
                    var selectedRows = excludeTable.rows({ selected: true }).data().toArray();
                    var ids = selectedRows.map(row => row.siteCode);

                    if (ids.length === 0) {
                        alert("Please select rows to move.");
                        return;
                    }

                    $.ajax({
                        url: '/Home/MoveToInclude',
                        type: 'POST',
                        contentType: 'application/json',
                        data: JSON.stringify(ids),
                        success: function () {
                            excludeTable.ajax.reload();
                            includeTable.ajax.reload();
                        }
                    });
                });

                $('#btnLeft').click(function () {
                    var selectedRows = includeTable.rows({ selected: true }).data().toArray();
                    var ids = selectedRows.map(row => row.siteCode);

                    if (ids.length === 0) {
                        alert("Please select rows to move.");
                        return;
                    }

                    $.ajax({
                        url: '/Home/MoveToExclude',
                        type: 'POST',
                        contentType: 'application/json',
                        data: JSON.stringify(ids),
                        success: function () {
                            excludeTable.ajax.reload();
                            includeTable.ajax.reload();
                        }
                    });
                });
            });

            function LoadGridExclude() {
                return $('#excludeTable').DataTable({
                    ajax: {
                        url: '/Home/LoadExclude',
                        type: 'GET',
                        datatype: 'json'
                    },
                    columns: [
                        { data: 'siteCode', title: 'SiteCode', autoWidth: true },
                        { data: 'legacyDoor', title: 'Legacy Door', autoWidth: true },
                        { data: 'buyingGroup', title: 'Buying Group', autoWidth: true },
                        { data: 'settingName', title: 'Setting Name', autoWidth: true }
                    ],
                    select: {
                        style: 'multi'
                    },
                    paging: false
                });
            }

            function LoadGridInclude() {
                return $('#includeTable').DataTable({
                    ajax: {
                        url: '/Home/LoadInclude',
                        type: 'GET',
                        datatype: 'json'
                    },
                    columns: [
                        { data: 'siteCode', title: 'SiteCode', autoWidth: true },
                        { data: 'legacyDoor', title: 'Legacy Door', autoWidth: true },
                        { data: 'buyingGroup', title: 'Buying Group', autoWidth: true },
                        { data: 'settingName', title: 'Setting Name', autoWidth: true }
                    ],
                    select: {
                        style: 'multi'
                    },
                    paging: false
                });
            }
    </script>
}

<div style = "vertical-align:top;">
    <table id = "excludeInclude" width = "100%" style = "vertical-align:top;">
        <tr style = "vertical-align:top;">
            <td valign = "top">
                
                <table id = "excludeTable" class = "display" style = "width:100%; height:30%; float:left; clear:both; vertical-align:top; border:1px solid;">
                    <thead>
                        <tr>
                            <th>SiteCode</th>
                            <th>Legacy Door</th>
                            <th>Buying Group</th>
                            <th>Setting Name</th>
                        </tr>
                    </thead>
                    <tbody>
                        
                    </tbody>
                </table>
            </td>
            <td valign = "top" style = "width:5%; float:left; clear:both; margin-left:5px; margin-right:5px; margin-top:95px;">
                <div id = "btnPanel">
                    <button id = "btnRight" class = "btn-logic"><b> >> </b></button>
                    <button id = "btnLeft" class = "btn-logic"><b> << </b></button>
                </div>
            </td>
            <td valign = "top">
                
                <table id = "includeTable" class = "display" style = "width:100%; height:30%; float:left; clear:both; vertical-align:top; border:1px solid;">
                    <thead>
                        <tr>
                            <th>SiteCode</th>
                            <th>Legacy Door</th>
                            <th>Buying Group</th>
                            <th>Setting Name</th>
                        </tr>
                    </thead>
                    <tbody>
                        
                    </tbody>
                </table>
            </td>
        </tr>
    </table>
</div>

Привет @Fengzhi Zhou, спасибо за ответ. Позвольте мне проверить это и вернуться к вам. Спасибо.

KitKat 04.09.2024 13:12

Привет @Fengzhi Zhou. Я могу выбирать строки, нажимая на строки, но когда нажимаю кнопку со стрелкой вправо, появляется сообщение «пожалуйста, выберите строку для перемещения». почему он не может распознать выбор строки в таблице данных??? Пожалуйста, помогите.

KitKat 04.09.2024 20:11

Я начал проект с новым шаблоном, чтобы не было проблем с миграцией, и вы должны заставить его работать как положено. Пожалуйста, нажмите F12 и проверьте значения, переданные в вашу функцию щелчка. Если оно равно нулю, возможно, в коде вашего проекта есть ошибки.

Fengzhi Zhou 05.09.2024 11:58

Привет @Fengzhi Zhou, большое спасибо за ответ.

KitKat 05.09.2024 12:21

Другие вопросы по теме