【发布时间】:2020-12-26 00:06:49
【问题描述】:
我有一个 EditForm,它将 AnimalList 作为具有动物列表的模型。我在动物对象上使用数据注释。在前端,我能够将动物名称列表显示为下拉 + 文本输入组合并将对象添加到该列表中。 因此,您将选择一个动物名称并为该动物分配一个友好的名称。 即我选择“Giraffe”,然后给它一个友好的长颈鹿名字,比如“Brian”。 然后单击添加更多会将空白默认值添加到列表中并可以继续等。 我试图使用数据注释在每一行的文本输入字段上进行一些客户端验证,因为如果我将友好名称留空,我应该会收到一条消息,指出该字段是必需的。最好在我在文本字段内单击并离开之后(我认为是 onBlur?)。
我觉得这应该是标准的,但我觉得使用列表会使标准验证变得更加困难。
如果我输入一些文本,单击离开,然后删除所述文本并单击离开,我会得到验证,这并不理想。 更重要的是,当我单击提交时,我觉得表单应该验证然后不提交,因为应该有消息,但这也不起作用并且提交得很好。我已经尝试过 context.validate 并且它返回 true?
我应该在这里查看某种自定义验证还是应该这样做?
AddAnimals.Razor 代码:
<Css />
<h3>Add your animals</h3>
<EditForm Class="login-form" Model="@AnimalList" OnValidSubmit="SaveAnimals">
<DataAnnotationsValidator/>
@if (!string.IsNullOrEmpty(Error))
{
<Notification Type="@NotificationType.Error" Message="@Error" />
}
<div class="form-group">
<div class="form-row">
<div class="col-6">
<label for="Select">Select Animal</label>
</div>
<div class="col">
<label>Animal Name</label>
</div>
</div>
<ul>
@foreach (var animalSelection in AnimalList.SelectedAnimals)
{
<li>
<div class="form-row">
<div class="col-6">
<select class="form-control" @bind="animalSelection.AnimalName">
<option value="" disabled selected hidden>Select...</option>
@foreach (var name in AnimalNames)
{
<option value="@name">@name</option>
}
</select>
</div>
<div class="col">
<InputText class="form-control" @bind-Value="animalSelection.FriendlyName" />
<ValidationMessage For="@(() => animalSelection.FriendlyName)" />
</div>
</div>
</li>
}
</ul>
</div>
<div class="form-group">
<button type="button" class="btn" @onclick="AddMoreAnimals">+ Add More</button>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Continue</button>
</div>
</EditForm>
@code {
[Parameter]
public AnimalList AnimalList { get; set; } = new AnimalList();
[Parameter]
public List<string> AnimalNames { get; set; } = new List<string>();
public string Error { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
AnimalNames = AnimalsService.GetAnimals();
await GetAnimalList();
if (AnimalList.SelectedAnimals.Count < 1)
{
AddMoreAnimals();
}
StateHasChanged();
}
}
private async Task GetAnimalList()
{
AnimalList.SelectedAnimals = await AnimalsService.GetAnimals();
}
private void AddMoreAnimals()
{
AnimalList.AddDefault();
}
private async void SaveAnimals(EditContext context)
{
AnimalList.TrimList();
foreach (var animal in AnimalsList.SelectedAnimals)
{
var response = await AnimalsService.AddAnimal(animal);
if (response.IsError)
{
Error = response.Error;
StateHasChanged();
break;
}
else
{
Error = string.Empty;
}
}
}
}
动物列表
public class AnimalList
{
public List<Animal> SelectedAnimals { get; set; }
public AnimalList()
{
SelectedAnimals = new List<Animal>();
}
public void AddDefault()
{
SelectedAnimals.Add(new Animal());
}
public void TrimList()
{
//Trim away possible unused rows
SelectedAnimals.RemoveAll(
item => string.IsNullOrEmpty(item.FriendlyName) &&
string.IsNullOrEmpty(item.AnimalName));
}
}
动物
public class Animal
{
[Required(ErrorMessage = "Animal selection is required")]
public string AnimalName { get; set; }
[Required(ErrorMessage = "You must enter a name for your Animal")]
[DisplayFormat(ConvertEmptyStringToNull = true)]
public string FriendlyName { get; set; }
}
【问题讨论】:
-
这可以通过一个表单列表来完成,您将为每个项目提供一个验证上下文。你并没有真正发布
-
这是您要寻找的行为吗? i.imgur.com/JYQyhmc.gif
标签: c# validation blazor data-annotations