Выберите тег помощника для индекса - PullRequest
0 голосов
/ 05 марта 2019

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

Это то, что у меня есть

Просмотр

@model IEnumerable<Taijitan.Models.Domain.Move>
@{
    ViewData["Title"] = "Moves";
}

<h2>@ViewData["Title"]</h2>
<div class="form-group">
     //Returns filter1
    <select asp-items="@ViewData["Difficulty"] as List<SelectListItem>" class="form-control">
        <option value="">-- Select Difficulty --</option>
    </select>
     //Returns filter2
    <select asp-items="@ViewData["Type"] as List<SelectListItem>" class="form-control">
        <option value="">-- Select Type --</option>
    </select>
</div>

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

Контроллер

    public IActionResult Index(string filter, string filter2)
    {
        IEnumerable<Move> Moves = null;
        if (filter == null && filter2 == null){
            Moves = _MoveRepository.GetAll();
        }
        else if (filter != null && filter2 == null)
        {
            Moves = _MoveRepository.GetByDifficulty(int.Parse(filter));
        }
        else if (filter == null && filter2 != null))
        {
            Moves = _MoveRepository.GetByType(filter);
        }
        else if (filter != null && filter2 != null))
        {
            Moves = _MoveRepository.GetByType(filter).Where(m => m.Difficulty == int.Parse(filter2);
        }
        ViewData["Type"] = GetTypesAsSelectList();
        ViewData["Difficulty"] = GetDifficultiesAsSelectList();
        return View(Moves);
    }

Метод, который создает отображаемый список выбора (почти то же самое для DifficultyList)

private List<SelectListItem> GetTypesAsSelectList()
{
    List<SelectListItem> TypesList = new List<SelectListItem>();
    foreach (Move move in _MoveRepository.GetAll().Distinct())
    {
        TypesList.Add(new SelectListItem { Text = Move.Type, Value = Move.Type });
    }

    return TypesList;

Я застрял в том, чтобы выяснить, как передать выбранное значение из раскрывающихся списков в качестве фильтра и фильтра2 в индекс.

EDIT

Я добавил элемент формы и эту кнопку:

<a asp-controller="Move" asp-action="Index" asp-route-filter="" asp-route-filter2="" class="btn btn-default">Filter</a>

Я не могу понять, как получить значение первого списка в asp-route-filter и значение второго списка в asp-route-filter2.

1 Ответ

1 голос
/ 06 марта 2019

Одним из основных элементов представления HTML-формы является элемент <form></form>. Исходя из вашего вопроса, я предполагаю, что ваша форма будет делать GET вместо POST. Я предполагаю это, потому что действие по умолчанию контроллера - GET. Еще одна кнопка - SUBMIT (если вы не планируете отправлять форму через javascript или иным способом).

Вам также не хватает asp-for="", который представляет собой причудливый способ заполнения Name и Id элемента представления. Для вашего примера вы должны использовать filter и filter2 в качестве значений. Хотя я бы реорганизовал эти имена в будущем. Атрибут Name позволяет связыванию модели привязывать элементы запроса к параметрам контроллера.

С учетом этого ваша приведенная ниже форма будет выглядеть следующим образом (обратите внимание на добавленный элемент FORM, элемент BUTTON и добавление asp-for="").

@model IEnumerable<Taijitan.Models.Domain.Move>
@{
    ViewData["Title"] = "Moves";
}

<h2>@ViewData["Title"]</h2>
<form method="GET">
<div class="form-group">
     //Returns filter1
    <select asp-items="@ViewData["Difficulty"] as List<SelectListItem>" class="form-control" asp-for="filter">
        <option value="">-- Select Difficulty --</option>
    </select>
     //Returns filter2
    <select asp-items="@ViewData["Type"] as List<SelectListItem>" class="form-control" asp-for="filter2">
        <option value="">-- Select Type --</option>
    </select>
    <a asp-controller="Move" asp-action="Index" asp-route-filter="" asp-route-filter2="" class="btn btn-default">Filter</a>
</div>
</form>

Вы также можете использовать @Html.Helpers для этих элементов. Это ваш выбор. Результаты одинаковы.

...