HiddenFor работи ли неправилно, когато изчистя елемент от списъка?

Имам модел:

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

Да кажем, че в списъка имаме 3 елемента. След това генерирам с EditorFor html за местоположения:

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

Второто местоположение беше изтрито от html (с javascript маркирам флага за това местоположение като изтрит)

В Действието изтривам от списъка с местоположения изтрито местоположение

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