HiddenFor работает неправильно, когда я очищаю элемент списка?

У меня есть модель:

public class MyModel
{
    public List<Location> Locations { get; set; }
}

Допустим, в списке у нас есть 3 пункта. Затем я генерирую с помощью EditorFor html для местоположений:

@Html.EditorFor(a => a.Locations)

Вторая локация была удалена из html (яваскриптом помечаю эту локацию как удаленную)

В Акции удаляю из списка локаций удаленную локацию

model.Locations.RemoveAll(a => a.IsDeleted);

Затем я создаю новое представление с таким содержимым:

@for (int locationIndex = 0; locationIndex < Model.Locations.Count; locationIndex++)
{
    @Html.HiddenFor(m => Model.Locations[locationIndex].Address) <br />
    @Html.HiddenFor(m => Model.Locations[locationIndex].LocationType) <br />
}

Хотя НЕ ВЕРЮ! Когда я смотрю на сгенерированный HTML-код, я вижу свое удаленное из списка местоположений местоположение, поэтому я вижу два местоположения: первое и второе. Но не первый, а третий

Пожалуйста, помогите, я никогда не видел такого поведения от MVC. Что я делаю неправильно?

ВАЖНОЕ ОБНОВЛЕНИЕ: как только я заменю @Html.HiddenFor простым html, он заработает.

    @for (int locationIndex = 0; locationIndex < Model.Locations.Count; locationIndex++)
    {
        <input type="hidden" name="Locations[@locationIndex].Address" value="@Model.Locations[locationIndex].Address" />
        <input type="hidden" name="Locations[@locationIndex].LocationType" value="@Model.Locations[locationIndex].LocationType" />
    }

person Sergey    schedule 23.08.2013    source источник
comment
Кстати, я на 100% уверен, что список локаций очищен правильно. Я отладил это. Может быть, мне нужно как-то очистить ViewData для второго элемента?   -  person Sergey    schedule 23.08.2013
comment
model.Locations.RemoveAll(a => a.IsDeleted); Эта строчка кода - это действие поста вашего контроллера? Обновляется ли объект Locations, как вы ожидаете, когда вы перешагиваете через него?   -  person User    schedule 23.08.2013
comment
Да, это действие POST. И да, локации обновляются, как и предполагалось. На самом деле, когда я устанавливаю точку останова, отладчик показывает третье местоположение, но HiddenFor генерирует второе (УДАЛЕННОЕ) местоположение.   -  person Sergey    schedule 23.08.2013


Ответы (2)


Я исправил это, но заменил помощника Html простым html, например:

 @for (int locationIndex = 0; locationIndex < Model.Locations.Count; locationIndex++)
    {
        <input type="hidden" name="Locations[@locationIndex].Address" value="@Model.Locations[locationIndex].Address" />
        <input type="hidden" name="Locations[@locationIndex].LocationType" value="@Model.Locations[locationIndex].LocationType" />
    }
person Sergey    schedule 24.10.2013
comment
Не делай этого. Это ModelState проблема. Вы можете просто использовать ModelState.Clear() перед возвратом представления. Но правильный подход состоит в том, чтобы следовать шаблону PRG и перенаправлять на ваш метод GET, а не возвращать представление (потому что это не одно и то же представление) - person ; 16.06.2018

У меня тоже была именно эта проблема. После удаления элемента из моего списка появятся ранее удаленные записи. Ваше решение решило это для меня, спасибо.

Чтобы помочь уточнить:

@Html.HiddenFor(m => Model[i].id)

Вызывал проблемы, но путем создания html-разметки вручную:

<input type="hidden" name="[@i].Id" value="@Model[i].Id" />

В результате удаленные поля остались удаленными.

person Rixium    schedule 15.06.2018