На странице в приложении Razor MVC из модели написано несколько строк, например:
@foreach (var item in Model)
{
// write lots of data
@Html.CheckBoxFor(item.Id) // incorrect syntax, I know
}
<input type="button" value="Update" onclick="Update();" />
javascript, запускаемый с кнопки, должен получить item.Id (который является уникальным целым числом) из каждого отмеченного флажка, помещает идентификаторы в массив и передает массив другой функции. Это то, с чем я работаю до сих пор:
function Update() {
var ids = document.getElementsByName("myCheckbox");
var idList = new Array(ids.length);
for (var i = 0; i < ids.length; i++) {
if (ids[i].checked {
idList.push(ids[i]);
}
}
$.ajax({
type: "POST",
url: "@Url.Action("Update", "Home")",
data: idList,
success: function (data) {
},
error: function (data) {
console.log(data);
}
});
}
Как мне добавить одно и то же имя ко всем флажкам и сделать их идентификатором item.Id?
Редактировать
Я попытался C предложить Мерфи, сделав класс для флажков:
public class ToBeUpdated
{
public int ID { get; set; }
public bool IsSelected { get; set; }
}
И затем добавить список в класс, который в модели:
public List<ToBeUpdated> ToBeUpdatedList { get; set; }
Однако я не могу понять, как написать CheckBoxFor. Его / ее предложение было:
@Html.CheckboxFor(modelItem => modelItem.SomeNameList[i].IsSelected)
Но я делаю не для l oop, а для foreach:
foreach (var item in Model)
Поэтому мне пришлось сделать это вместо:
@Html.CheckBoxFor(modelItem => item.ToBeUpdatedList.Find(m => m.ID == item.Id).IsSelected)
Тогда у меня есть кнопка, которая отправляет меня к функции в моем контроллере:
<input type="button" value="Update" onclick="location.href='@Url.Action("UpdateStatuses", "Home")'" />
public IActionResult UpdateStatuses(IEnumerable<FileData> model)
{
// iterate through the items in the model
}
Проблема в том, что когда я попадаю в UpdateStatuses, модель пуста, хотя у меня была тонна флажков, которые я проверил перед нажатием кнопки. Модель в представлении имеет вид
@model IEnumerable<MyData>
И MyData - это простой класс:
public class MyData
{
public int Id { get; set; }
public List<ToBeUpdated> ToBeUpdatedList { get; set; }
}
Редактировать 2: Наконец-то найдено решение
Я сделал свои флажки так:
<input type="checkbox" name="chkUpdateThis" id="@item.Id" />
И затем я мог, с помощью кода TJ, отредактировать мой javascript, чтобы сделать это:
function UpdateStatuses() {
const ids = [...document.querySelectorAll("[name=chkUpdateThis]")].filter(({checked}) => checked).map(({id}) => id)
var idList = new Array();
for (var i = 0; i < ids.length; i++) {
idList.push(parseInt(ids[i]));
}
$.ajax({
type: "POST",
url: "@Url.Action("UpdateStatuses", "Home")",
data: ({ ids: idList }),
success: function (data) {
},
error: function (data) {
console.log(data);
}
});
}
Тогда я могу позвонить функция UpdateStatuses в моем контроллере Home:
public IActionResult UpdateStatuses(List<int> ids)
Так как TJ не опубликовал предложение, чтобы я мог поставить флажок, я передам его C Мерфи, который также был полезным. Я не воспользовался его предложением, но я не хочу ставить себе флажок, хотя решение, которое я выбрал, здесь.