У меня есть модель представления, содержащая список, например:
class School
{
public List<Student> Students { get; set; }
}
class Student
{
public int Id { get; set; }
public String Name { get; set; }
}
У меня есть форма, в которой я отправляю информацию о нескольких учениках, связанную с одной школой. Теперь я могу добавить/удалить одного ученика из формы.
Добавление работает нормально, но моя проблема и мой вопрос связаны с удалением студента.
Итак, позвольте мне объяснить это на примере:
Допустим, я добавляю 3 студентов, тогда их имена и идентификаторы будут привязаны к модели следующим образом:
Students[0].Id = "1"
Students[0].Name = "Student A"
Students[1].Id = "2"
Students[1].Name = "Student B"
Students[2].Id = "3"
Students[2].Name = "Student C"
Если я сохраню это, он отлично работает. Но скажем, я удаляю студента с помощью Id = "2". При отправке происходит то, что только студент с идентификатором = "1" привязывается и отдыхает после удаленного индекса (то есть студент с id = "3") не привязывается.
У меня такой вопрос: возможно ли вообще привязать этот id="3" после удаления id="2"? Или в правильном смысле можно связать/отправить список с пропущенными индексами.
Я нашел ниже упомянутые статьи о самом stackoverflow, но то, что я могу сделать из них, немного противоречит или, может быть, я их неправильно понимаю.
Я не умею объяснять проблемы. Поэтому, пожалуйста, скажите мне, могу ли я добавить что-нибудь, чтобы сделать его более наглядным.
Спасибо.
Пример кода удаления:
Скрипт для удаления кода Js
Что вы подразумеваете под «привязанным», вы говорите, что когда вы удаляете студента с ID = 2, ID = 3 также удаляется из списка? Также весь индекс вашего списка равен 0, возможно, опечатка?
Также, если вы можете опубликовать код для добавления/удаления элементов, это было бы более полезно, без кода трудно сказать, в чем проблема.
Под привязкой я подразумеваю, что при нажатии кнопки «Отправить» публикуются значения. Поэтому, если я удалю студента с Id = "2", только Студенты [0].Id и Студенты [0].Name будут отправлены на сервер, а остальные не будут опубликованы.
Я добавил простой код html/js для добавления/удаления. Поэтому, если я добавлю 5 студентов и удалю 1 в индексе [3], тогда будут опубликованы только значения до индекса [2]. Надеюсь, это немного полезнее.
Я публикую этот ответ для дальнейшего использования для всех, у кого есть такие же сомнения.
Итак, если у вас есть такая коллекция:
public class Book {
public string Title { get; set; }
public string Author { get; set; }
public DateTime DatePublished { get; set; }
}
//Action method on HomeController
public ActionResult UpdateProducts(ICollection<Book> books) {
return View(books);
}
И ваша форма после добавления 3-х книг выглядит так:
<form method = "post" action = "/Home/Create">
<input type = "text" name = "[0].Title" value = "Curious George" />
<input type = "text" name = "[0].Author" value = "H.A. Rey" />
<input type = "text" name = "[0].DatePublished" value = "2/23/1973" />
<input type = "text" name = "[1].Title" value = "Code Complete" />
<input type = "text" name = "[1].Author" value = "Steve McConnell" />
<input type = "text" name = "[1].DatePublished" value = "6/9/2004" />
<input type = "text" name = "[2].Title" value = "The Two Towers" />
<input type = "text" name = "[2].Author" value = "JRR Tolkien" />
<input type = "text" name = "[2].DatePublished" value = "6/1/2005" />
<input type = "submit" />
</form>
Теперь, если вы, ребята, хотите добавить функцию удаления, чтобы ваша форма могла содержать непоследовательные записи, то можно сделать что-то вроде этого:
<form method = "post" action = "/Home/Create">
<input type = "hidden" name = "products.Index" value = "cold" />
<input type = "text" name = "products[cold].Name" value = "Beer" />
<input type = "text" name = "products[cold].Price" value = "7.32" />
<input type = "hidden" name = "products.Index" value = "123" />
<input type = "text" name = "products[123].Name" value = "Chips" />
<input type = "text" name = "products[123].Price" value = "2.23" />
<input type = "hidden" name = "products.Index" value = "caliente" />
<input type = "text" name = "products[caliente].Name" value = "Salsa" />
<input type = "text" name = "products[caliente].Price" value = "1.23" />
<input type = "submit" />
</form>
В приведенном выше примере мы предоставляем скрытый ввод с суффиксом .Index для каждого элемента, который нам нужно привязать к списку. Это даст компоновщику модели хороший набор индексов для поиска при привязке к списку.
Более подробную информацию о том же можно найти здесь. haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
В настоящее время в качестве исправления я добавил логическое свойство с именем IsDeleted в мою студенческую модель, и при нажатии кнопки удаления я просто делаю его IsDeleted истинным и скрываю содержимое от пользовательского интерфейса.