选择标签助手以过滤索引

时间:2019-03-05 19:54:26

标签: c# asp.net model-view-controller tag-helpers

我正在尝试使用选择标记助手来按难度和类型过滤移动列表。到目前为止,我有一个有效的下拉菜单,但我不知道如何将所选值重定向到控制器中的index方法。

这就是我所拥有的

查看

@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>

该下拉列表应该将所选值返回给索引方法,该方法采用字符串作为过滤器。

控制器

    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);
    }

创建显示的selectList的方法(与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;

我一直想弄清楚如何将下拉列表的选定值作为filter和filter2传递给索引。

编辑

我添加了一个表单元素和此按钮:

<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 个答案:

答案 0 :(得分:1)

<form></form>元素是HTML表单提交的核心内容。根据您的问题,我假设您的表单将执行GET而不是POST。我认为这是因为控制器的默认操作是GET。另一个是SUBMIT按钮本身(除非您计划通过javascript或其他方式提交表单)。

您还缺少asp-for="",这是填充视图元素的NameId的一种好方法。例如,您将使用filterfilter2作为值。尽管我将来会重构这些名称。 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。那是你的选择。结果是相同的。