У меня есть BookCreateModel, который состоит из информации о плоскости книги, такой как Title,PublishYear и т. д., а также коллекция книг авторов (сложный тип):
public class BookCreateModel
{
public string Title { get; set; }
public int Year { get; set; }
public IList<AuthorEntryModel> Authors { get; set; }
}
public class AuthorEntryModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
в представлении CreateBook я использовал помощник EditorFor
:
@Html.EditorFor(m => m.Authors, "AuthorSelector")
и шаблон AuthorSelector, как показано ниже:
<div class="ptr_authors_wrapper">
@for (int i = 0; i < Model.Count; i++)
{
<div class="ptr_author_line" data-line-index="@i">
@Html.TextBoxFor(o => o[i].FirstName)
@Html.TextBoxFor(o => o[i].LastName)
</div>
}
</div>
<script>
...
</script>
шаблон AuthorSelector
содержит некоторые разметки-оболочки, которые должны учитывать индекс каждого отображаемого элемента, а также некоторый javascript, который обрабатывает взаимодействие дочернего ввода и должен быть отрисован один раз (внутри шаблона AuthorSelector
), таким образом избавляясь цикла for/или шаблона AuthorSelector невозможно.
теперь проблема в том, что EditorFor ведет себя немного странно и генерирует такие входные имена:
<input id="Authors__0__FirstName" name="Authors.[0].FirstName" type="text" value="" />
<input id="Authors__0__LastName" name="Authors.[0].LastName" type="text" value="" />
как вы можете видеть, вместо создания имен, таких как Authors[0].FirstName
, он добавляет дополнительную точку, из-за которой связыватель модели по умолчанию не может анализировать опубликованные данные.
Есть идеи ?
Спасибо !