问题描述
我有一个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");
属性将完成其余工作。