SelectList中的所选项目未显示在视图下拉列表中

问题描述

我有一个asp.net MVC应用程序,其中有一个用于创建新事件的Razor视图。表单上是一个季节下拉列表,供用户选择。我希望在本列表中认选择当前季节。

我已经设置了两个季节:

第1季适用于2020-2021年,其IsCurrent属性设置为False; 第2季适用于2021-2022,并且其IsCurrent属性设置为True

控制器代码...

ViewData["Seasons"] = new SelectList(_context.Seasons,"ID","SeasonName",_context.Seasons.Where(s => s.IsCurrent==true));

查看...

<select asp-for="SeasonID" class="form-control" asp-items="ViewBag.Seasons"></select>

运行此命令时,我希望下拉菜单中预选了2021-2022赛季,但它只显示2020-2021年(在列表中排在第一位)。

这似乎应该很简单-有人可以告诉我我要去哪里了吗

解决方法

这个人过去曾经咬过我几次,一直追溯到MVC 3左右。

基本上,如果要将模型传递给视图(即使用@model MyTypeOfViewModel指令)并将select绑定到该模型的属性,则选择列表的选定值为在视图模型上绑定到的属性的。直接在选择列表中设置选择的项目将被忽略

在您的情况下,它是SeasonID

<select asp-for="SeasonID" ...>

因此,要选择Season 2,需要将视图模型上的SeasonID属性的值设置为ID的{​​{1}}:>

Season 2

但是,如果您直接绑定var viewModel = new SeasonViewModel { SeasonID = // Season 2's SeasonID } 的值,则像这样创建select

select

将使用您在创建// Notice I've not specified `asp-for`. <select class="form-control" asp-items="ViewBag.Seasons"></select> 时设置的选定值。就是说,您执行此操作的代码目前略有错误。应该是:

SelectList

简而言之,如果您想绑定到var selected = _context.Seasons .Where(s => s.IsCurrent == true) .FirstOrDefault(); ViewData["Seasons"] = new SelectList( _context.Seasons,"ID","SeasonName",// It needs to be the actual value of the field,not the season's object. selected?.ID.ToString()); 属性,请创建SeasonID,而不选择值,就像这样:

SelectList

然后在视图模型本身上设置选定的值,其余的ViewData["Seasons"] = new SelectList( _context.Seasons,"SeasonName"); 属性将完成其余工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...