'Bind Dropdownlist with TagHelpers
I am trying to create a dropdownlist and bind with viewbag using ASP.NET Core tag helpers.
I can bind the dropdownlist using:
@Html.DropDownList("Area_id", 
                   new SelectList(ViewBag.Areas, "Value", "Text"), 
                   "Select an Area")
But I have hard time to use ASP.NET Core tag helper on HTML "Select":
<select asp-for="" asp-items="" />
My code always has red line under asp-for="Area_id" saying Area_id is not accessible. I tried to use asp-for="Id" and still doesn't work. The GetAreas() function works fine. Please help!
Model classes:
public class DegreeViewModel
{
    public int Degree_id { get; set; }
    public int Area_id { get; set; }
    public List<SelectListItem> Areas { get; set; }
}
        
public IActionResult Index()
{
    var vm = new DegreeViewModel();
    vm.Areas = GetAreas();
    return View(vm);
}
Controller:
private MyContext _context;
[BindProperty(SupportsGet = true)]
public int Area_id  { get; set; }
[BindProperty(SupportsGet = true)]
public int? Degree_id { get; set; }     
public IActionResult Index()
{
     var vm = new DegreeViewModel();
        vm.Areas = GetAreas();
        return View(vm);
}
public List<SelectListItem> GetAreas()
{
    var Areas = (from a in _context.Degrees
                 select new SelectListItem { Text = a.Area_name, Value = a.Area_id.ToString() }).ToList();
    Areas.Add(new SelectListItem("Select", "0"));
    return Areas;
}
Index.cshtml
@model DegreeViewModel
<form asp-action="GetResult" asp-controller="Home" method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
   
        <label  class="control-label">Areas</label>
        <select asp-for="Area_id" asp-items="@(new SelectList(Model.Areas,"Value","Text"))"  />
        <span asp-validation-for="Area_id" class="text-danger"></span>
    
    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
    </div>
</form>
							
						Solution 1:[1]
The model's type you passed to page is IEnumerable, So you can't use asp-for="Area_id". You need to use @foreach(var item in model){} and then asp-for="item.Area_id". Because your question is how Bind Dropdownlist with TagHelpers and don't provide the post method, So i will just show how to use TagHelpers to bind dropdownlist.
public IActionResult Index()
        {
            //If you want to use `<select>`, you need to use specific class `SelectListItem`
           
           List<SelectListItem> test = new List<SelectListItem>();
                foreach (var item in GetAreas())
                {
                    test.Add(new SelectListItem { Text = item.Area_name, Value = item.Id.ToString() });
                }
            ViewBag.Areas = test;
            return View();
        }
page
<select asp-items="@ViewBag.Areas" name="xxx" Id="xxx"></select>
    					Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | Xinran Shen | 
