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

Selected item in SelectList not being displayed in view drop-down

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

我设置了两个季节:

第 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>

当我 运行 这样做时,我希望在下拉列表中看到 select 预编辑的 2021-2022 赛季,但它只显示 2020-2021(是第一个列表)。

这看起来应该很简单 - 谁能告诉我哪里出错了?

这个问题过去曾困扰过我几次,一直回到 MVC 3 左右。

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

在你的情况下,SeasonID 来自:

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

因此,对于 select Season 2,您需要将视图模型上的 SeasonID 属性 的值设置为 ID 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 时设置的 selected 值。也就是说,您执行此操作的代码目前有点错误。应该是:

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,而不 select 值,如下所示:

ViewData["Seasons"] = new SelectList(
            _context.Seasons,
            "ID",
            "SeasonName");

然后在视图模型本身上设置 selected 值,select 上的 asp-for 属性将完成剩下的工作。