我什么都试过了,在谷歌上搜索了很多,但仍然无法正常工作。我正在尝试将<EditForm>
与<InputSelect>
一起使用来更新现有对象(在我的情况下为video
(。
-
我想要一个
InputSelect
和@bind-Value="video.DisplayId"
。然后第一个选择的选项将是;或者1。if video.DisplayId is null
,然后显示"None"
。2.if video.DisplayId is not null
,显示对象的名称(video.Display.Name
(。 -
然后将
displays
的整个列表加载到具有foreach
的选项中,但当前选定的除外。 -
如果是
video.DisplayId is not null
,则在"None"
的末尾添加一个选项。
加载Blazor页面时,所有内容的值看起来都很好,当我选择(即从video.Display.Name
到"None"
(并点击"保存"时,它就工作了。
但当我从"None"
转到display.Name
时,它会说Object引用没有设置为对象的实例(请参阅下面的代码,它在哪里说(。
我的代码:
<InputSelect class="form-select" @bind-Value="video.DisplayId">
@if (video.DisplayId is null)
{
<option selected value="">None</option>
}
else
{
// Object reference not set to an instance of an object ....
<option selected value="@video.DisplayId">@video.Display.Name</option>
}
@foreach (Display display in displays.Where(display => display.Id != video.DisplayId))
{
<option value="@display.Id">@display.Name</option>
}
@if (video.DisplayId is not null)
{
<option value="">None</option>
}
</InputSelect>
我认为这与Blazor以及它在我选择后如何呈现页面有关,但我该如何解决这个问题?
又过了几个小时,我明白了。我需要重写代码如下:
<InputSelect class="form-select" @bind-Value="video.DisplayId">
@if (video.DisplayId is null)
{
<option selected value="">None</option>
}
@foreach (Display display in displays)
{
<option value="@display.Id">@display.Name (ID: @display.Id)</option>
}
@if (video.DisplayId is not null)
{
<option value="">None</option>
}
</InputSelect>
在按下Save后,它会调用我的方法,在我的方法中,它会更改数据库中的数据,然后我必须再次从数据库中获取列表。
@page "/"
<EditForm Model=@video>
<InputSelect @bind-Value=@video.DisplayId>
@if (video.DisplayId is null)
{
<option value="">none</option>
}
else
{
<option value=@selectedDisplay?.Id>@selectedDisplay?.Name</option>
}
@foreach (var display in unSelectedDisplays)
{
<option value=@display.Id>@display.Name</option>
}
@if (video.DisplayId is not null)
{
<option value="">none</option>
}
</InputSelect>
</EditForm>
@code {
private Video video = new Video();
private IEnumerable<Display> displays = Enumerable.Empty<Display>();
private IEnumerable<Display> unSelectedDisplays =>
displays.Where(display => display.Id != video.DisplayId);
Display? selectedDisplay => video.DisplayId.HasValue ?
displays.First(d => d.Id == this.video.DisplayId) :
default(Display);
protected override void OnInitialized()
{
displays = Enumerable.Range(0, 10)
.Select(i => new Display { Id = i, Name = $"Name{i}" });
}
public class Display
{
public int Id { get; set; }
public string? Name { get; set; }
}
public class Video
{
public int? DisplayId { get; set; }
}
}