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

问题描述 投票:0回答:2

我有一个 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 年(列表中的第一个)。

这看起来应该很简单 - 有人可以告诉我哪里出错了吗?

asp.net-mvc html-select default selectlist
2个回答
1
投票

这个问题过去已经困扰过我好几次了,一直到 MVC 3 左右。

基本上,如果您将模型传递到视图(即使用

@model MyTypeOfViewModel
指令)并将
select
绑定到该模型上的属性,则选择列表的选定值就是该属性的 值您正在绑定到您的视图模型。直接在选择列表中设置所选项目将被忽略

就你而言,它是

SeasonID
来自:

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

因此,要选择

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
时设置的选定值。也就是说,您执行此操作的代码目前略有错误。应该是:

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,
            "ID",
            "SeasonName");

然后在视图模型本身上设置选定的值,选择上的

asp-for
属性将完成剩下的工作。


0
投票

它可能与您的问题无关,但可能对其他人有帮助......

我在 Razor 组件中选择表单下拉列表时遇到问题。最初,我尝试使用 bool 变量而不是字符串,但它没有按预期运行。为了解决这个问题,我直接将DropDown中的变量和选项值转换为字符串,成功解决了问题。

<select class="form-select" value="@IsFriday.ToString()" @onchange="OnDataChanged">
    <option value="@true.ToString()">It is Friday</option>
    <option value="@false.ToString()">It is not Friday</option>
</select>

然后在方法中:

private async Task OnDataChanged(ChangeEventArgs e)
{
    IsFriday = Convert.ToBoolean(e.Value);
}
© www.soinside.com 2019 - 2024. All rights reserved.