Почему я получаю случайные нулевые элементы в коллекции после привязки модели?
Я использую пакет BeginCollectionItem для ASP MVC. У меня есть форма для создания и сущности, которая имеет свойство ICollection. Это свойство должно быть заполнено элементами динамически в форме.
Вот как выглядит DTO:
public class WorkoutDTO
{
public int Id { get; set; }
//Some other properties
public ICollection <Exercise> Exercises { get; set; }
}
public class Exercise
{
public int ExerciseSelected { get; set; }
//Some other properties
}
А вот так выглядят виды:
@using (Html.BeginForm("Create", "Project", FormMethod.Post))
{
//Bunch of other inputs
@Html.Partial("_Exercise_Form", Model.Exercise_Create)
<input class="btn btn-action add-exercise-button" type="button" value="Add">
}
Частичное представление Exercise_Form:
@model TrackMe.Web.ViewModels.Workout_Create
@using (Html.BeginCollectionItem("Exercises"))
{
@Html.HiddenFor(m => m.Id)
@Html.DropDownListFor(m => m.ExerciseSelected, new SelectList(Model.Exercises, "Id", "Name"), "Exercise", new { @class = "form-control" })
@Html.TextBoxFor(m => m.Repetition1, new { @class = "form-control", placeholder = "Rep" })
@Html.TextBoxFor(m => m.Weight1, new { @class = "form-control", placeholder = "Kg" })
@Html.TextBoxFor(m => m.Repetition2, new { @class = "form-control", placeholder = "Rep" })
@Html.TextBoxFor(m => m.Weight2, new { @class = "form-control", placeholder = "Kg" })
@Html.TextBoxFor(m => m.Repetition3, new { @class = "form-control", placeholder = "Rep" })
@Html.TextBoxFor(m => m.Weight3, new { @class = "form-control", placeholder = "Kg" })
@Html.TextBoxFor(m => m.Repetition4, new { @class = "form-control", placeholder = "Rep" })
@Html.TextBoxFor(m => m.Weight4, new { @class = "form-control", placeholder = "Kg" })
@Html.TextBoxFor(m => m.Repetition5, new { @class = "form-control", placeholder = "Rep" })
@Html.TextBoxFor(m => m.Weight5, new { @class = "form-control", placeholder = "Kg" })
}
Все работает нормально, когда я делаю POST, я вижу правильные индексы, назначенные для каждого элемента в коллекции:
Exercises.index:ae5247e5-b207-488d-84f9-3e2a9a8423ff
Exercises[ae5247e5-b207-488d-84f9-3e2a9a8423ff].Id:0
Exercises[ae5247e5-b207-488d-84f9-3e2a9a8423ff].ExerciseSelected:3
Exercises.index:352598b5-9264-4c8d-9501-ac5deb6e911d
Exercises[352598b5-9264-4c8d-9501-ac5deb6e911d].Id:0
Exercises[352598b5-9264-4c8d-9501-ac5deb6e911d].ExerciseSelected:3
Exercises.index:b64be97b-adbf-4d03-98d0-9d4f13d84ac6
Exercises[b64be97b-adbf-4d03-98d0-9d4f13d84ac6].Id:0
Exercises[b64be97b-adbf-4d03-98d0-9d4f13d84ac6].ExerciseSelected:6
Проблема в том, что иногда, случайно, некоторые элементы коллекции Exercises, которые приходят к моему контроллеру, имеют значение null:
[ResponseType(typeof(Workout))]
public IHttpActionResult Post(WorkoutDTO workoutDto)
{
var userId = User.Identity.GetUserId();
...
}
Что может быть причиной такого поведения? Я знаю, что если я использую цикл for с целочисленным индексом, это может привести к этим проблемам, потому что я могу разорвать последовательное связывание, но это GUID, верно?
Примечания: Моя модель представления Model.Exercise_Create выглядит почти так же, как и DTO.
ОБНОВЛЕНИЕ: Теперь я вижу, что единственные нулевые элементы - это элементы с индексом GUID, начинающимся с буквы. Посмотрите FormData, который я отправил, чтобы подтвердить это:
1) Exercises.index:ae5247e5-b207-488d-84f9-3e2a9a8423ff --> NULL
2) Exercises.index:352598b5-9264-4c8d-9501-ac5deb6e911d --> NOT NULL
3) Exercises.index:b64be97b-adbf-4d03-98d0-9d4f13d84ac6 --> NULL
У меня нет привязки пользовательских данных, это странно...