Skip to content

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

Open
@hakenr

Description

@hakenr

Is there an existing issue for this?

  • 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).

// Since we're not writing to CurrentValue, we'll need to notify about modification from here
EditContext.NotifyFieldChanged(FieldIdentifier);

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

// Since we're not writing to CurrentValue, we'll need to notify about modification from here
EditContext.NotifyFieldChanged(FieldIdentifier);

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).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions