最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

forms - Blazor validation of List of object - Stack Overflow

programmeradmin10浏览0评论

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.

发布评论

评论列表(0)

  1. 暂无评论