Я работаю над приложением Asp MVC, которое содержит сетку данных, которые я хочу отфильтровать с помощью списка флажков. Я хочу иметь возможность фильтровать мои данные из одного или нескольких выборов. На данный момент это работает только из одного выбора. Я использую выражение ссылки для фильтрации своих данных. Я хотел бы иметь следующий эквивалент в SQL:
select * from mission_supportmission where decision in (item1, item2..)
Мой взгляд выглядит так:
<div class="wrapper">
<nav id="sidebar">
@using (Html.BeginForm("Index", "Missions", FormMethod.Get))
{
@Html.EditorFor(x => x.Decision)
}
</nav>
<div id="content" class="container">
<table class="table table-bordered">
<tr>
<th class="col-md-2">
Decision
</th>
</tr>
@foreach (var item in Model.OnePageOfMissions)
{
<tr>
<td class="col-md-1">
@Html.DisplayFor(modelItem => item.decision)
</td>
</tr>
}
@Html.PagedListPager((IPagedList)Model.OnePageOfMissions, page => Url.Action("Index", new { page, Decision = Model.Decision}))
</table>
</div>
Я создал шаблон для отображения списка флажков следующим образом:
<div class="form-check row">
@Html.HiddenFor(x => x.ID)
@Html.CheckBoxFor(x => x.IsChecked, htmlAttributes: new { onchange = "form.submit();", @class = "form-check-input col-md-2" })
@Html.LabelFor(x => x.Display, Model.Display, htmlAttributes: new { @class = "form-check-label col-md-8" })
Мой контроллер выглядит так:
public ActionResult Index(int? page, List<CheckBoxListItem> Decision)
{
IndexViewModel model = new IndexViewModel();
//Display Missions
model.missionsList = db.missions_supportmission.ToList();
//Retrieve parameters
model.Decision = Decision;
//PagedList
var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
var onePageOfMissions = model.missionsList.ToPagedList(pageNumber, 10); // will only contain 10 products max because of the pageSize(equel to 10)
model.OnePageOfMissions = onePageOfMissions;
//Filter
if (model.Decision != null)
{
var selecteddecision = model.Decision.Where(x => x.IsChecked).Select(x => x.ID);
foreach (var item in selecteddecision)
{
model.OnePageOfMissions = db.missions_supportmission
.Where(a => a.decision.Contains(item))
.OrderBy(a => a.id)
.Select(s => s).ToPagedList(pageNumber, 10);
}
}
//Display CheckBox
//Checkboxlist (!important => mettre ce bloc de code après la requête link qui permet de filtrer sur les checkbox)
var allDecisions = db.list_decision.ToList();//returns List<list_decision>
var checkBoxListItems = new List<CheckBoxListItem>(); //nouvelle instance de la classe checkboxlist
model.Decision = checkBoxListItems;
foreach (var decison in allDecisions)
{//On assigne les valeurs "id", "display" et "is checked" à la variable checkboxlistitem
checkBoxListItems.Add(new CheckBoxListItem()
{
ID = decison.decision_id,
Display = decison.name_en,
IsChecked = false //On the add view, no decision are selected by default
});
}
return View(model);
}
У меня также есть ViewModel:
namespace MissionsDF.Models
{
public class IndexViewModel
{
public IEnumerable<missions_supportmission> missionsList { get; set; }
public List<CheckBoxListItem> Decision { get; set; }
public IndexViewModel()
{
this.Decision = new List<CheckBoxListItem>();
}
public IPagedList<missions_supportmission> OnePageOfMissions { get; set; }
public bool IsChecked;
}
}