我正在尝试使用选择标记助手来按难度和类型过滤移动列表。到目前为止,我有一个有效的下拉菜单,但我不知道如何将所选值重定向到控制器中的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中获取第二个列表的值。
答案 0 :(得分:1)
<form></form>
元素是HTML表单提交的核心内容。根据您的问题,我假设您的表单将执行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
。那是你的选择。结果是相同的。