У меня есть небольшая функциональность, которую мне нужно разместить на нескольких страницах, поэтому я реализовал ее как частичное представление.Связывание сложных объектов во время формы post
В этом частичном представлении у меня есть выпадающий список, кнопка добавления и «элементы», каждая из которых включает кнопку удаления. Функциональность очевидна. Нажатие на любую из кнопок удаления удаляет связанный элемент, выбирая элемент из раскрывающегося списка и нажав кнопку add, добавляет этот элемент.
Сложность в том, что это должно произойти полностью в javascript - изменения в списке элементов должны происходить полностью на стороне клиента, и на сервере ничего не происходит до тех пор, пока не будет представлена форма в целом. (То есть, мы не хотим обновлять сервер через ajax при каждом изменении, мы хотим собирать изменения и отправлять их в toto на форме submit.)
Вторая сложность заключается в том, что эта форма должна быть довольно значительно снижается с минимальными требованиями к родительскому виду.
Так я создал ViewModel для частичного:
public class ItemsModel
{
// The list to be displayed in the dropdown
public List<KeyValuePair<string, string>> itemsList { get; set; }
// The list of selected items
public List<string> items { get; set; }
public string itemsJson
{
get { return JsonConvert.SerializeObject(this.items); }
set { this.items = JsonConvert.DeserializeObject<List<string>>(value);
}
public ItemsModel()
{
this.itemsList = new List<KeyValuePair<string, string>>();
this.items = new List<string>();
}
}
И ViewModel для этой страницы содержит экземпляр этого:
public class MyViewModel
{
// Assorted stuff
public ItemsModel itemsModel;
}
Когда контроллер строит модель, в течение HttpGet, он заполняет объект ItemsModel двумя списками. Вид на странице включает в себя частичное прохождение itemsModel:
@{Html.RenderPartial("_itemsList", Model.itemsModel);
В парциальное я построить выпадающий список:
@Html.DropDownList("itemsList", new SelectList(Model.itemsList, "Key", "Value")
И я заселить с JavaScript:
var items = $.parseJSON('@Html.Raw(Model.itemsJson)');
var itemsUl = $('#itemsUl');
itemsUl.empty();
var iTemplate = $('#itemTemplate').html();
for (var i=0; i<items.length; i++)
{
var template = iTemplate.nformat("{item}": items[i]);
itemsUl.append($(template));
}
И это насколько я понял. Мое намерение заключалось в том, чтобы добавить javascript для обработки вставок и удалений, но на данный момент нет смысла. Потому что, когда я отправляю страницу с немодифицированными списками, MyViewModel.itemsModel имеет значение NULL. Просматривая в Интернете, я видел несколько сообщений о том, как MVC связывает элементы Request с сложными списками, но ни одна из них не относится к моей проблеме, потому что ничто не попадает в MVC для привязки.
Я смотрел в Fiddler, и запрос, который отправляется, включает в себя «... & itemsList = & ...» - он не отправляет никаких данных вообще.
Так что мне интересно, полностью ли я преследую неправильный путь. Каков нормальный способ включения сложных данных в форму submit? Я прочитал в FormData(), но, похоже, применяется только к отправке в стиле Ajax, это не влияет на нормальную форму submit.
Любые идеи?