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
属性将完成剩下的工作。
我有一个 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
属性将完成剩下的工作。