У меня возникли проблемы с пониманием того, как работают asp.net mvc.asp.net mvc modelbinding не обязательные коллекции
Модели
public class Detail
{
public Guid Id { get; set; }
public string Title {get; set; }
}
public class Master
{
public Guid Id { get; set;}
public string Title { get; set; }
public List<Detail> Details { get; set; }
}
Посмотреть
<!-- part of master view in ~/Views/Master/EditMaster.cshtml -->
@model Master
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.Id)
@Html.TextBoxFor(m => m.Title)
@Html.EditorFor(m => m.Details)
<!-- snip -->
}
<!-- detail view in ~/Views/Master/EditorTemplates/Detail.cshtml -->
@model Detail
@Html.HiddenFor(m => m.Id)
@Html.EditorFor(m => m.Title)
Контроллер
// Alternative 1 - the one that does not work
public ActionResult Save(Master master)
{
// master.Details not populated!
}
// Alternative 2 - one that do work
public ActionResult Save(Master master, [Bind(Prefix="Details")]IEnumerable<Detail> details)
{
// master.Details still not populated, but details parameter is.
}
Вынесено HTML
<form action="..." method="post">
<input type="hidden" name="Id" value="....">
<input type="text" name="Title" value="master title">
<input type="hidden" name="Details[0].Id" value="....">
<input type="text" name="Details[0].Title value="detail title">
<input type="hidden" name="Details[1].Id" value="....">
<input type="text" name="Details[1].Title value="detail title">
<input type="hidden" name="Details[2].Id" value="....">
<input type="text" name="Details[2].Title value="detail title">
<input type="submit">
</form>
Почему хотите модель Связующее по умолчанию заполнения Подробности-свойство на модели? Почему я должен включать его в отдельный параметр в контроллер?
Я прочитал несколько сообщений об asp и привязке к спискам, включая Haackeds, которые упоминаются несколько раз в других вопросах. Это было this thread на SO, которые привели меня к опции [Binding(Prefix...)]
. В нем говорится, что «модель, вероятно, слишком сложна», но что именно «слишком сложно» для стандартного связующего устройства?
Вы посмотрели на возможность создания собственных связующих устройств? Вот хорошая рекомендация для пользовательских привязок моделей: [Из журнала MSDN] (http://msdn.microsoft.com/en-us/magazine/hh781022.aspx) – jacqijvv
нет, я видел возможность, но я больше любопытно, почему asp не может решить этот случай сам ... – Vegar
вы должны взглянуть на этот старый [пост] (http://haacked.com/archive/2008/10/23/model-binding-to -a-list.aspx /) Фила Хаака, он довольно четко объясняет, что заставляет тип слишком сложно связывать.Но в целом динамически невозможно (MVC DefaultModelBinder) определить, что «случайная» коллекция ** id ** и ** title ** в объекте Request на самом деле является частью коллекции без использования индексов. – jacqijvv