I am trying to validate the fields within an object. I want all the fields to have values, but I am encountering an error when submitting.
System.InvalidOperationException: Could not find property named x on object of type
System.Collections.Generic.List`1[[HivrsPlatform.Common.Contracts.Activities.Qwilr.TokenSubstitution,
HivrsPlatform.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
at Blazored.FluentValidation.EditContextFluentValidationExtensions.ToFieldIdentifier(EditContext& editContext, String& propertyPath)
at Blazored.FluentValidation.EditContextFluentValidationExtensions.ValidateModel(EditContext editContext, ValidationMessageStore messages, IServiceProvider serviceProvider, Boolean disableAssemblyScanning, FluentValidationValidator fluentValidationValidator, IValidator validator)
at Blazored.FluentValidation.EditContextFluentValidationExtensions.<AddFluentValidation>b__0.MoveNext()
this is the Test.Razor
@using Blazored.FluentValidation
@inherits ComponentBase
<MudDialog>
<DialogContent>
<EditForm EditContext="_editContext" OnValidSubmit="OnValidSubmit">
<FluentValidationValidator @ref="_fluentValidationValidator" Validator="_validator" DisableAssemblyScanning="true"/>
@{
foreach (var item in _items)
{
var index = _items.IndexOf(item);
<MudGrid>
<MudItem xs="12" sm="6" md="11">
<MudGrid>
<MudItem xs="12" sm="6" md="6">
<MudTextField Label="Key" @bind-Value="item.Key" For="@(() => item.Key)" Variant="Variant.Outlined"/>
</MudItem>
<MudItem xs="12" sm="6" md="6">
<MudTextField Label="Value" @bind-Value="item.Value" For="@(() => item.Value)" Variant="Variant.Outlined"/>
</MudItem>
</MudGrid>
</MudItem>
<MudItem xs="12" sm="6" md="1" Style="display: flex; justify-items: end; align-items: center;">
@if (_items.Count > 1)
{
<MudFab Color="Color.Primary" StartIcon="@Icons.Material.Filled.Remove" Size="Size.Small" OnClick="@(() => OnRemoveClicked(item))"/>
}
else if (index == _items.Count - 1)
{
<MudFab Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add" Size="Size.Small" OnClick="OnAddClicked"/>
}
</MudItem>
</MudGrid>
}
@if (_items.Count > 1)
{
<MudGrid Justify="Justify.FlexEnd">
<MudItem xs="12" sm="6" md="1">
<MudFab Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add" Size="Size.Small" OnClick="OnAddClicked"/>
</MudItem>
</MudGrid>
}
}
</EditForm>
</DialogContent>
<DialogActions>
<MudButton OnClick="OnCancelClicked">Cancel</MudButton>
<MudButton Color="Color.Primary" OnClick="OnSubmitClicked">Save</MudButton>
</DialogActions>
</MudDialog>
this is the Test.razor.cs
public partial class Test
{
private EditContext _editContext = default!;
private Validator_validator = default!;
private FluentValidationValidator _fluentValidationValidator = default!;
[Parameter] public List<TokenSubstitution> _items { get; set; } = default!;
[CascadingParameter] private MudDialogInstance MudDialog { get; set; } = default!;
protected override void OnParametersSet()
{
if (!_items.Any())
{
_items.Add(new TokenSubstitution());
}
_editContext = new EditContext(this);
_validator = new Validator();
}
private async Task OnSubmitClicked()
{
if (!await _fluentValidationValidator.ValidateAsync())
return;
await OnValidSubmit();
}
}
this is the Validator.cs
public class Validator: AbstractValidator<List<TokenSubstitution>>
{
public QwilrTokenSubstitutionValidator()
{
RuleForEach(x => x).SetValidator(new TokenSubstitutionValidator());
}
}
public class TokenSubstitutionValidator : AbstractValidator<TokenSubstitution>
{
public TokenSubstitutionValidator()
{
RuleFor(x => x.Key)
.NotEmpty().WithMessage("Key is required.")
.MaximumLength(100).WithMessage("Key cannot exceed 100 characters.");
RuleFor(x => x.Value)
.NotEmpty().WithMessage("Value is required.")
.MaximumLength(500).WithMessage("Value cannot exceed 500 characters.");
}
}
this is the TokenSubstitution.cs
public class TokenSubstitution
{
public string Key { get; set; }
public string Value { get; set; }
}
I want all the fields to have values, and show validation message.