我正在使用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();
此后,我使用以下代码创建了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的一个时,应该选择选择的选项。这是调试器的输出,它是正确的,也是我所假设的:
但这是页面的呈现代码。值2应该已经选择:
这是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>
对于这种行为,我没有任何解释。可能是错误吗?还是有人在我的编程中看到错误? 谢谢,帕特里克
答案 0 :(得分:0)
我的天哪!该解决方案很简单,但记录最糟。 在Razor Pages中,不再使用SelectedListItem属性。
您要做的是将选择的值分配给“选择”列表中用于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>
我希望这也会对任何发疯的人有所帮助