剃刀页SelectListItem未选中

时间:2018-08-09 10:42:07

标签: razor-pages asp.net-core-tag-helpers selectlistitem

我正在使用ASP.net剃须刀页面,选择列表的标记帮助程序有问题。 尤其是具有SelectListItem的选定属性。

我从数据库中获得了一个操作系统列表,该列表是通过DeviceId分配给设备的。

启动页面时,我假设已选择“设备绑定”操作系统。设备ID由OnGet方法的参数通过int ID发布。

这是检查设备是否绑定操作系统的代码。它将返回操作系统的db-id。

var SelectedOperatingSystemId = await _context.LicenseRelationships
                    .Include(lr => lr.License)
                    .ThenInclude(l => l.Software)
                    .Where(lr => lr.DeviceMetaDataId == id)
                    .Select(x => x.License.Software.Id)
                    .SingleOrDefaultAsync();

以下是调试器的输出: enter image description here

此后,我使用以下代码创建了IEnumerable:

OpertaingSystemsList = await _context.Softwares
            .Where(s => s.IsOperatingSystem == true)
            .OrderBy(s => s.Name)
            .Select(s => new SelectListItem
            {
                Value = s.Id.ToString(),
                Text = s.Name,
                Selected = s.Id == SelectedOperatingSystemId
            })
            .ToListAsync();

因此,当db-id等于变量SelectedOperatingSystemId的一个时,应该选择选择的选项。这是调试器的输出,它是正确的,也是我所假设的:

enter image description here

但这是页面的呈现代码。值2应该已经选择:

enter image description here

这是HTML标记:

<div class="form-group">
                <label asp-for="OperatingSystemId"></label>
                <select asp-for="OperatingSystemId" asp-items="Model.OpertaingSystemsList" class="form-control">
                    <option value="">Betriebssystem wählen</option>
                </select>
            </div>

对于这种行为,我没有任何解释。可能是错误吗?还是有人在我的编程中看到错误? 谢谢,帕特里克

1 个答案:

答案 0 :(得分:0)

我的天哪!该解决方案很简单,但记录最糟。 在Razor Pages中,不再使用SelectedListItem属性。

看这里:LearnRazorPages.com

您要做的是将选择的值分配给“选择”列表中用于aps-for的属性。

这是您的财产:

[BindProperty]
public int OperatingSystemId { get; set; }

您的Select在asp-for中使用了此属性,在我的情况下,必须为此属性分配选定的值,这是通过以下代码实现的:

OperatingSystemId = await _context.LicenseRelationships
                    .Include(lr => lr.License)
                    .ThenInclude(l => l.Software)
                    .Where(lr => lr.DeviceMetaDataId == id)
                    .Select(s => s.License.Software.Id)
                    .SingleOrDefaultAsync();

最后,选择标记必须看起来像这样:

<label asp-for="OperatingSystemId"></label>
<select asp-for="OperatingSystemId" asp-items="Model.OpertaingSystemsList">
     <option value="">Choose Operating System</option>
</select>

我希望这也会对任何发疯的人有所帮助