ASP.NET Core 2.2 - Filtering Entities
This article will describe how to filter a list of entities. I will assume you have created a new ASP.NET Core 2.2 Razor Pages project. I won't use Identity or Individual User Accounts.
This article continues a series about table functions:
The FREE ASP.NET Core 6.0 - Demos And Utilities Project includes a Table Functions Demo. Access to the source code is free for registered users at Manage > Assets.
I will try to add value to many great articles about filtering by using a dropdown and radio button group to select entities.
Edit Index.cshtml.cs, add the filtering properties and queries:
private readonly FoodDbContext _context; public IndexModel(FoodDbContext context) { _context = context; } public int Count { get; set; } public class RadioButtonProperties { public string Name { get; set; } public string ElementId { get; set; } public bool IsSelected { get; set; } } public List<RadioButtonProperties> ColdStoreRadioButtons { get; set; } [Display(Name = "Store Cold")] public string SelectedColdStoreRadio { get; set; } [Display(Name = "Food Type")] public FoodType SelectedFoodType { get; set; } public IList<SelectListItem> FoodTypes { get; set; } = new List<SelectListItem>(); public IList<Food> Foods { get; set; } = new List<Food>(); public void OnGet(FoodType selectedFoodType = FoodType.All, string selectedColdStoreRadio = "All") { SelectedFoodType = selectedFoodType; FoodTypes = new List<SelectListItem>(); var options = Enum.GetValues(typeof(FoodType)); foreach (var type in options) { FoodTypes.Add(new SelectListItem() { Text = type.ToString(), Value = type.ToString() }); } ColdStoreRadioButtons = new List<RadioButtonProperties>() { new RadioButtonProperties() { Name = "All", ElementId = "ColdStoreRadioButtonAll" }, new RadioButtonProperties() { Name = "Yes", ElementId = "ColdStoreRadioButtonYes" }, new RadioButtonProperties() { Name = "No", ElementId = "ColdStoreRadioButtonNo" } }; SelectedColdStoreRadio = selectedColdStoreRadio; var foodQuery = _context.Foods.AsQueryable(); switch (SelectedFoodType) { case FoodType.Fruit: foodQuery = _context.Foods.Where(f => f.FoodType == FoodType.Fruit).AsQueryable(); break; case FoodType.Vegtable: foodQuery = _context.Foods.Where(f => f.FoodType == FoodType.Vegtable).AsQueryable(); break; case FoodType.Other: foodQuery = _context.Foods.Where(f => f.FoodType == FoodType.Other).AsQueryable(); break; default: break; } switch (SelectedColdStoreRadio) { case "Yes": foodQuery = foodQuery.Where(f => f.ColdStore == true).AsQueryable(); break; case "No": foodQuery = foodQuery.Where(f => f.ColdStore == false).AsQueryable(); break; default: break; } Foods = foodQuery.ToList(); Count = Foods.Count(); }
Edit Index.cshtml, add the dropdown and radio buttons:
<div class="row pt-1 mb-2"> <div class="col-12 mb-1"> <a asp-route-currentPage="" asp-route-selectedFoodType="" asp-route-selectedColdStoreRadio="" class="btn btn-primary">Reset</a> <h4 class="d-inline ml-2"> Count = @Model.Count.ToString() </h4> </div> </div> <div class="row mb-2"> <div class="col-12 col-md-4 col-lg-4"> <h5 class="">@Html.DisplayNameFor(model => model.SelectedFoodType)</h5> <form class="" id="FoodTypeForm" method="get"> <input type="hidden" asp-for="SelectedColdStoreRadio" /> <select class="form-control mb-1" asp-for="SelectedFoodType" asp-items="@Model.FoodTypes" onchange="getFoodType();"></select> </form> </div> <div class="col-12 col-md-5 col-lg-6 mb-2"> <h5 class="">@Html.DisplayNameFor(model => model.SelectedColdStoreRadio)</h5> @for (var i = 0; i < Model.ColdStoreRadioButtons.Count(); i++) { <div class="custom-control custom-radio custom-control-inline"> <input type="radio" value="@Model.ColdStoreRadioButtons[i].Name" class="custom-control-input" id="@Model.ColdStoreRadioButtons[i].ElementId" asp-for="SelectedColdStoreRadio" /> <label class="custom-control-label" for="@Model.ColdStoreRadioButtons[i].ElementId"> @Model.ColdStoreRadioButtons[i].Name </label> </div> } </div> </div>
Notice the Enum.GetValues(typeof(FoodType)).
Edit Index.cshtml, add the JavaScript:
function getFoodType() { document.querySelector('#FoodTypeForm').submit(); } // After DOMContentLoaded var coldStoreRadioButtons = document.querySelectorAll('[name="SelectedColdStoreRadio"]'); var rbl = coldStoreRadioButtons.length; for (var rb = 0; rb < rbl; rb++) { coldStoreRadioButtons[rb].addEventListener('click', function (event) { var selectFoodType = document.querySelector('#SelectedFoodType'); var foodType = selectFoodType.options[selectFoodType.selectedIndex].text; var coldStore = document.querySelector('input[name="SelectedColdStoreRadio"]:checked').value; location.replace('/index?currentPage=1' + '&selectedFoodType=' + foodType + '&selectedColdStoreRadio=' + coldStore); }); }
Build, run and test.
Update 12/30/2021
Announced the ASP.NET Core 6.0 - Demos And Utilities Project. Updated articles, asset and topic links.
Comments(0)