aspnetcore icon indicating copy to clipboard operation
aspnetcore copied to clipboard

[Blazor] InputBase - failed parsing (eg. InputNumber) triggers field validation

Open hakenr opened this issue 1 year ago • 0 comments

Is there an existing issue for this?

  • [x] I have searched the existing issues

Describe the bug

If the parsing of input value fails (TryParseValueFromString() returns false), InputBase triggers EditContext.NotifyFieldChanged(FieldIdentifier); which causes all the other field validations to run although the Value of the field did not change (CurrentValue remains unchanged, ValueChanged is not invoked, Model is not changed).

https://github.com/dotnet/aspnetcore/blob/049814ca468cad1ea1e29412e0aa3eea182a63c1/src/Components/Web/src/Forms/InputBase.cs#L142-L143

Expected Behavior

EditContext.NotifyFieldChanged() should be called only when the Value of the field changes (causing revalidation of the field).

Steps To Reproduce

Simple repro:

<EditForm Model="formModel">
    <DataAnnotationsValidator />
    <InputNumber @bind-Value="formModel.Value" />

    <button type="submit">Submit</button>

    <ValidationSummary />
</EditForm>

@code {
    private FormModel formModel = new FormModel();

    public class FormModel
    {
        [Required]
        public int? Value { get; set; }
    }
}
  1. Focus on the empty input and type 1e+10 as an unparseable input. Hit Tab to trigger onchange for the input.
  2. The ValidationSummary displays both the ParsingErrorMessage and the regular validation message from the RequiredAttribute (since formModel.Value remains null when the input can't be parsed): Image

BTW: In contrast, if you reset the page:

  1. Enter any valid number into the input, e.g., 5. Trigger onchange by leaving the input.
  2. Focus on the input again, replace the 5 with 1e+10, and leave the input.
  3. The ValidationSummary only displays the ParsingErrorMessage, as model validation is satisfied (formModel.Value is still 5). Image

https://github.com/dotnet/aspnetcore/blob/049814ca468cad1ea1e29412e0aa3eea182a63c1/src/Components/Web/src/Forms/InputBase.cs#L142-L143
I think EditContext.NotifyFieldChanged() should not be called when the field's value hasn't changed (which is the case if parsing fails). I'm not sure why the EditContext.NotifyFieldChanged() call is there (possibly from the initial implementation of input components by @SteveSandersonMS), but if the intent was to ensure ParsingErrorMessage gets displayed, it should be managed by the subsequent EditContext?.NotifyValidationStateChanged(); call.

Exceptions (if any)

No response

.NET Version

9.0.100-rc.1.24452.12 (same on any earlier)

Anything else?

If we agree this needs to be changed, I can prepare a PR to fix it (including new E2E tests).

hakenr avatar Oct 14 '24 11:10 hakenr