Я работаю над проектом 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; }
}
Прямо сейчас я не могу выбирать (одиночные и множественные) строк, щелкая строки обеих таблиц данных и передавая строки между таблицами.
Как это сделать? Пожалуйста, помогите.
Опция datatables serverSide: true,
предназначена не только для начальной загрузки данных, она также используется для разбиения на страницы/сортировки и т. д. Поскольку ваши данные не являются переменными (они жестко запрограммированы в каждой загрузке), они (в настоящее время) не могут быть изменены. измененный. Если намерение состоит в том, чтобы сохранить/сохранить изменения пользователей, начните с сохранения/сохранения исходных данных, а затем их можно будет изменить. Если это интеллектуальный подход (т. е. изучение таблиц данных), удалите serverSide: true,
и (предварительно) загрузите свои данные в HTML или через javascript - тогда вы сможете работать чисто на стороне клиента (я не рекомендую это делать, но это то, что у вас есть сейчас). )
У вас нет полного маршрута публикации данных, и есть некоторые ошибки. Вот образец, которому вы можете следовать.
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, спасибо за ответ. Позвольте мне проверить это и вернуться к вам. Спасибо.
Привет @Fengzhi Zhou. Я могу выбирать строки, нажимая на строки, но когда нажимаю кнопку со стрелкой вправо, появляется сообщение «пожалуйста, выберите строку для перемещения». почему он не может распознать выбор строки в таблице данных??? Пожалуйста, помогите.
Я начал проект с новым шаблоном, чтобы не было проблем с миграцией, и вы должны заставить его работать как положено. Пожалуйста, нажмите F12 и проверьте значения, переданные в вашу функцию щелчка. Если оно равно нулю, возможно, в коде вашего проекта есть ошибки.
Привет @Fengzhi Zhou, большое спасибо за ответ.
Я не вижу ни одного вашего кода, который отправляет выбранные данные из одной таблицы в контроллер, а данные из разных таблиц обновляются. Я думаю, вам нужно рассмотреть возможность хранения данных для таблиц включения/исключения в контроллере, а не жестко закодировать их.