У меня есть HTML, который выглядит так:
<input type="text" name="data[]" value="George"/>
<input type="text" name="data[]" value="John"/>
<input type="text" name="data[]" value="Paul"/>
<input type="text" name="data[]" value="Ringo"/>
В PHP я могу получить этот массив, например:
$array = $_POST['name'];
// $array[0] == "George"
В ASP.NET MVC соглашения об объединении моделей заставляют меня помещать индексы в HTML, поэтому контроллер может получать массив.
<!-- HTML for the ASP.NET MVC Version -->
<input type="text" name="data[0]" value="George"/>
<input type="text" name="data[1]" value="John"/>
<input type="text" name="data[2]" value="Paul"/>
<input type="text" name="data[3]" value="Ringo"/>
// C# Controller
public ActionResult SomeAction(string[] data)
{
// Do stuff
}
Если я отправлю первый HTML, данные будут null
в действии.
Ну, я думаю, это отстой.
Если я использую код на стороне клиента для удаления или добавления элементов в массив, я должен написать код для переопределения массива HTML.
Есть ли способ расширить ASP.NET MVC ModelBinder для привязки массивов без индексов или обходного пути для решения этой проблемы?
ИЗМЕНИТЬ
После того, как вы попробуете свои ответы, я прихожу к выводу, что приведенный выше пример не полезен для моих целей. Моя реальная ситуация такова:
Вид
<table>
@for (var i = 0; i < Model.Sections.Count; ++i)
{
<tr>
<td><a href="#" class="edit-section"><span class="glyphicon glyphicon-question-sign"></span></a></td>
<td>@Html.TextBoxFor(m => Model.Sections[i].SectionOrder, new { @class = "form-control" })</td>
<td>@Html.TextBoxFor(m => Model.Sections[i].Title, new { @class = "form-control" })</td>
<td>@Html.TextBoxFor(m => Model.Sections[i].SubTitle, new { @class = "form-control" })</td>
<td>
@Html.HiddenFor(m => Model.Sections[i].Id)
<a href="#" class="delete-section"><span class="glyphicon glyphicon-remove"></span></a>
</td>
</tr>
}
</table>
Действие
public ActionResult SaveSections(ICollection<SectionModel> sections)
{
// DO STUFF
}
Я попытался сделать входы HTML вручную, например:
@for (var i = 0; i < Model.Sections.Count; ++i)
{
<tr>
<td><a href="#" class="edit-section"><span class="glyphicon glyphicon-question-sign"></span></a></td>
<td>@Html.TextBox("Sections.SectionOrder", Model.Sections[i].SectionOrder, new { @class = "form-control" })</td>
<td>@Html.TextBox("Sections.Title", Model.Sections[i].Title, new { @class = "form-control" })</td>
<td>@Html.TextBox("Sections.SubTitle", Model.Sections[i].SubTitle, new { @class = "form-control" })</td>
<td>
@Html.Hidden("Sections.SubTitle", Model.Sections[i].Id)
<a href="#" class="delete-section"><span class="glyphicon glyphicon-remove"></span></a>
</td>
</tr>
}
Но это не сработало...