Пустое перечисление в методе post

У меня есть такая точка зрения

@model IEnumerable<ViewModelRound2>

... <snip> ...

@{
    using (Html.BeginForm(new { round1Ring3Bids = Model }))
    {
        if (Model != null && Model.Count() > 0)
        {
                ... <snip> ...

                @for (var x = 0; x < Model.Count(); x++)
                {
                    ViewModelRound2 viewModelRound2 = Model.ElementAt(x);
                    Bid bid = viewModelRound2.Bid;

                    string userName = @bid.User.Invitation.Where(i => i.AuctionId == bid.Lot.Lot_Auction_ID).First().User.User_Username;

                    <tr>
                        <td>
                            @userName
                        </td>
                        <td>
                            @bid.Bid_Value
                        </td>
                        <td>
                            @Html.EditorFor(c => c.ElementAt(x).SelectedForRound2) 
                        </td>
                    </tr>
                }

            </table>

            <div class="buttonwrapper2">
                <input type="submit" value="Select"/>              
            </div>
        }
    }
}

У меня есть метод записи, который идет, когда нажата кнопка отправки

[HttpPost]
        public ActionResult Round2Manager(IEnumerable<ViewModelRound2> round1Ring3Bids)

Проблема в том, что перечисление всегда пусто. Почему это?

1 ответ

Решение

Проблема в том, что перечисление всегда пусто. Почему это?

Потому что вы не соблюдаете формат проводника, который по умолчанию для связывания моделей ожидает связывание коллекций.

Следующие:

@Html.EditorFor(c => c.ElementAt(x).SelectedForRound2) 

генерирует абсолютно неправильные имена для ваших полей ввода.

Я бы порекомендовал вам использовать шаблоны редактора, чтобы избежать подобных проблем:

@model IEnumerable<ViewModelRound2>

@using (Html.BeginForm())
{
    if (Model != null && Model.Count() > 0)
    {
        <table>
            @Html.EditorForModel()
        </table>
        <div class="buttonwrapper2">
            <input type="submit" value="Select"/>              
        </div>
    }
}

а затем определить пользовательский шаблон редактора для ViewModelRound2 тип (~/View/Shared/EditorTemplates/ViewModelRound2.cshtml), который будет автоматически отображаться для каждого элемента этой коллекции:

@model ViewModelRound2
@ {
    string userName = Model.Bid.User.Invitation.Where(
        i => i.AuctionId == Model.Bid.Lot.Lot_Auction_ID
    ).First().User.User_Username;
}

<tr>
    <td>
        @userName
    </td>
    <td>
        @Model.Bid.Bid_Value
    </td>
    <td>
        @Html.EditorFor(c => c.SelectedForRound2) 
    </td>
</tr>

Теперь вы заметите, как поля ввода текста имеют правильные имена:

name="[0].SelectedForRound2"
name="[1].SelectedForRound2"
name="[2].SelectedForRound2"
...

Сравните это с вашими начальными значениями.

Другие вопросы по тегам