Я понял вашу проблему, и у меня вполне может быть решение тоже:)!
Во-первых, позвольте мне объяснить вам, что я узнал, изучив исходный код фреймворка (всегда полезно проверить исходный код проекта с открытым исходным кодом, чтобы лучше понять, как работают определенные вещи.
1 -) При использовании простых строго типизированных помощников html (то есть все Html.xxxFor (...) методы, кроме EditorFor и DisplayFor ), в лямбда-выражении, определяющем свойство модели для рендеринга, имяСгенерированный html-элемент равен любой строке, следующей за « model => », минус то, что предшествует « => », то есть:
- строка " модель ", если модель коллекция
- или строка " модель. " (обратите внимание на ". "в конце) в противном случае.
Так, например, это:
<%: Html.TextBoxFor( m=>m.OneProperty.OneNestedProperty)%>
сгенерирует этот html output:
<input type="text" name="OneProperty.OneNestedProperty" ../>
И это:
<%: Html.TextBoxFor( m=>m[0].OneProperty.OneNestedProperty)%>
сгенерирует это:
<input type="text" name="[0].OneProperty.OneNestedProperty" ../>
==> Это частично объясняет, почему выполучен этот «странный» вывод html при использовании EditorFor.
2 -) При использовании сложных строго типизированных помощников (EditorFor и DisplayFor), то же самое предыдущее правило применяется внутри ассоциированного частичного представления ( ItemList.ascx в вашем случае), и в дополнение , все сгенерированные html-элементы будут иметь префикс что следует за "==>", как объяснено в 1 -) .
Префикс здесь: " Items. ", потому что у вас есть это втипизированное представление (Index.aspx):
<%:Html.EditorFor(m => m.Items) %>
==> Это полностью объясняет вывод и почему связыватель по умолчанию больше не работает с вашим списком элементов
Решением будет разбить ваш ItemWrapper в методе [HttpPost] на его свойства, а затемнас* Атрибут Bind с его параметром Prefix для каждого сложного свойства, например:
[HttpPost]
public string Index(string foo,[Bind(Prefix = "Items.")]IList<Item> items)
{
return "Hello";
}
(предполагается, что ItemWrapper также имеет простое свойство с именем Foo типа string)
Чтобы избежать конфликта, при перечислении свойств в методе post я настоятельно рекомендую указывать параметры в соответствии с именем каждого свойства (не важно, какойкейс) как я.
Надеюсь, это поможет!