Перечисление ViewModel пусто на HttpPost - PullRequest
0 голосов
/ 10 апреля 2019

Я работаю в ASP.Net, и у меня есть список моделей, которые я хочу отобразить на странице.Они содержат раскрывающийся список, и когда упомянутый раскрывающийся список обновляется, я должен взять это перечисление моделей представления, изменить наниматель внутри него и опубликовать его с изменениями.Однако, когда я делаю свое сообщение, вместо того, чтобы отправлять содержащиеся модели представления, оно отправляет пустое перечисление.

До сих пор я пытался переключить свой «foreach» в моем представлении на «для».Я также попытался изменить некоторые имена, чтобы увидеть, была ли проблема с подшивкой модели, но это не так.

Вот код, соответственно, вида, модели представления и контроллера.

Просмотр

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken();
    for (int i = 0; i < Model.Count(); i++)
    {
        @Html.DropDownListFor(model => model.ElementAt(i).PickedNormId, Model.ElementAt(i).PickableNorms, UiText.Prosyn.N_A, htmlAttributes: new { @class = "form-control dropdown_search", @name="NormPicker"@*, @onchange = "this.form.submit();"*@ })
    }
<div>
    <input name="selectedNormList" type="submit">
</div>
}

ViewModel

public class NormPickerViewModel : ViewModel
{
    public SelectList PickableNorms { get; set; }

    public int PickedNormId { get; set; }
}

Контроллер

public virtual ActionResult Index()
{
    List<NormPickerViewModel> viewModels = new List<NormPickerViewModel>();

    viewModels.Add(new NormPickerViewModel()
    {
        PickableNorms = new SelectList(
            _normRepository.GetAll().Where(x => x.Depth == 1).ToList(),
            "Id",
            "Description"
        )
    });

    return View(viewModels);
}

[HttpPost]
public virtual ActionResult Index(IEnumerable<NormPickerViewModel> selectedNormList)
{
    // selectedNormList's count is always zero.
}

Обычно я ожидаю найти выпадающие сообщения, которые я передал в«Получить» с их обновленными выбранными значениями, но я получаю пустое перечисление.

1 Ответ

1 голос
/ 10 апреля 2019

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

Изменить с IEnumerable<NormPickerViewModel> selectedNormList на IEnumerable<NormPickerViewModel> normPickerViewModel в контроллере.

Добавить имя для выбранного тега (DropDownListFor) Name = "normPickerViewModel[" + i + "].PickedNormId" в файле cshtml.

Вот код контроллера

[HttpGet]
    public virtual ActionResult Index()
    {
        List<NormPickerViewModel> viewModels = new List<NormPickerViewModel>();

        viewModels.Add(new NormPickerViewModel()
        {
            PickableNorms = new SelectList(
                new List<dynamic> { new { Id = 1, Description = "Test1" }, new { Id = 2, Description = "Test2" } },
                "Id",
                "Description"
            )
        });

        viewModels.Add(new NormPickerViewModel()
        {
            PickableNorms = new SelectList(
                new List<dynamic> { new { Id = 3, Description = "Test3" }, new { Id = 4, Description = "Test4" } },
                "Id",
                "Description"
            )
        });

        return View(viewModels);
    }

    [HttpPost]
    public virtual ActionResult Index(IEnumerable<NormPickerViewModel> normPickerViewModel)
    {
        // selectedNormList's count is always zero.
        return null;
    }

и код cshtml

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken();
    for (int i = 0; i < Model.Count(); i++)
    {
        @Html.DropDownListFor(model => model.ElementAt(i).PickedNormId, Model.ElementAt(i).PickableNorms, "NA", htmlAttributes: new
        {
            @class = "form-control dropdown_search",
            Name = "normPickerViewModel[" + i + "].PickedNormId"@*, @onchange = "this.form.submit();"*@ 
        })
    }
    <div>
        <input name="selectedNormList" type="submit">
    </div>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...