ASP.NET MVC 2: как выглядит C # View для редактирования вложенных сущностей? - PullRequest
2 голосов
/ 11 февраля 2010

За последние несколько недель я много раз пытался заставить серверный вид MVC 2 работать с объектами с вложенными элементами IList без особого успеха. Мне не хватает фундаментального понимания, что, я надеюсь, этот вопрос разрешится.

То, что я хочу, это форма, которая показывает список продуктов, где вы можете изменить информацию в строке, включая иерархию (список продуктов, каждый из которых имеет список субпродуктов, каждый из которых имеет список изображений, и т. д.) Я пытаюсь воссоздать старую форму MS Access, в которой в большой форме есть список продуктов, а в подформах отображаются связанные продукты, все из которых позволяют выполнять оперативное редактирование. Access сохраняет каждую запись, сосредоточившись на другой записи.

Допустим, у вас есть модель домена, которая выглядит следующим образом:

public class Product {
    ... // Lots of fields like public string name {get; set;}
    public IList<Department> departments {get; set;}
    public IList<SubProduct> subProducts {get; set;}
}
public class SubProduct {
    ... // Lots of fields like public string name {get; set;}
    public IList<Image> images {get; set;}
}
public class Image {
    ... // Lots of fields like public string name {get; set;}
}

И модель представления, которая выглядит следующим образом:

public class EditProduct {
    IList<Product> products {get; set;}
}

В MVC 2 View, как бы вы закодировали поля Edit, чтобы можно было отправить единственную модель обратно в контроллер? Я знаком с

<input id="products[0].subProducts[0].images[0].name" /... >

механика, но каждый IList нуждается в способе CRUD-элементов на одном экране. Это большой экран ввода данных, где скорость имеет значение, равно как и возможность видеть все продукты в списке. Мне нужны кнопки «Добавить», «Удалить» и средства для публикации всей формы после редактирования любых входных данных.

Если я посмотрю на это с точки зрения JQuery:

  • Я сериализую модель как JSON для начальной формы для первого N числа элементов IList
  • Я загружаю на лету дополнительные продукты в том же списке, когда они достигают дна контейнера div
  • Я принимаю всю модель при сохранении / публикации или принимаю фрагменты одинаковой формы для отдельных объектов, например, наличие отдельного тега html-формы для каждого элемента IList

Но по какой-то причине я просто не понимаю, как это сделать на стороне сервера. Любые ссылки или примеры кода для самого View будут великолепны. Элементы без IList, кажется, прекрасно работают, особенно с шаблонами пользовательского интерфейса. Буду ли я создавать несколько отдельных тегов HTML-форм вокруг каждой редактируемой сущности, и посты будут касаться только одного элемента за раз?

1 Ответ

0 голосов
/ 23 февраля 2010
<% for (int count = 0; count < Model.Students.Count; count++ )
   {                                              %><%= 
      Html.EditorFor(m => m.Students[count])      %><%
   } 
%>

Создает имена форм, такие как:

name="Students[0].Name"
name="Students[1].Name"
name="Students[2].Name"

Которые привязываются к исходной модели списка

...