Пройти словарь от просмотра к контроллеру - PullRequest
1 голос
/ 22 марта 2020

Модель:

public string FreeText { get; set; }
public Dictionary<int, string> SearchValues { get; set; }
public List<DropDownModel> DropDowns { get; set; }

Вид:

@using (Html.BeginForm("GetSearchResults", "Home", FormMethod.Post))
{
    @Html.TextBoxFor(m => m.FreeText, new { @class = "form-control mb-3", @placeholder = "Search..." })

    foreach (var dropDown in Model.DropDowns)
    {
        @Html.DropDownListFor(m => m.SearchValues[dropDown.DataFieldId], dropDown.ListItems, dropDown.OptionLabel, new { @class = "form-control mb-3" });
    }

    <button type="submit" class="btn btn-primary btn-block">Search</button>
}

Поле ввода FreeText передается совершенно нормально. Но даже несмотря на то, что раскрывающийся список для поля SearchValues ​​правильно отображается на странице, он возвращается как пустой (Count = 0) в контроллере. Почему я могу передать словарь в контроллер?

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Без использования картографа или изменения привязки свойств модели, самый простой способ сделать это - создать класс для ваших SearchValues.

  1. Создать класс SearchValue
public class SearchValue{
   public int Id {get;set;}
   public string value {get;set;}
}
Используйте это как список в вашей модели
public string FreeText { get; set; }
// replace dictionary
public List<SearchValue> SearchValues { get; set; }
public List<DropDownModel> DropDowns { get; set; }
Тогда используйте вид ниже
@using (Html.BeginForm("GetSearchResults", "Home", FormMethod.Post))
{
    @Html.TextBoxFor(m => m.FreeText, new { @class = "form-control mb-3", @placeholder = "Search..." })

    @{
        int counter = 0;
    }
    foreach (var dropDown in Model.DropDowns)
    {
        <input type="hidden" name="SearchValues[@counter].Id" value="@dropdown.DataFieldId">
        @Html.DropDownListFor(m => m.SearchValues[counter].Value, dropDown.ListItems, dropDown.OptionLabel, new { @class = "form-control mb-3" });
        @counter++;
    }

    <button type="submit" class="btn btn-primary btn-block">Search</button>
}
1 голос
/ 23 марта 2020

Мне удалось сохранить формат словаря, изменив kvp с <int, string> на <string, string>. Видимо, связыватель модели принимает ключ только в строковом формате.

...