Skip to content

Fix InputBase parse failure triggering unnecessary field validation - #65574

Open
kubaflo wants to merge 1 commit into
dotnet:mainfrom
kubaflo:fix/inputbase-parse-validation-58407
Open

Fix InputBase parse failure triggering unnecessary field validation#65574
kubaflo wants to merge 1 commit into
dotnet:mainfrom
kubaflo:fix/inputbase-parse-validation-58407

Conversation

@kubaflo

@kubaflo kubaflo commented Mar 1, 2026

Copy link
Copy Markdown
Contributor

🤖 AI Summary

🔍 Automated Fix Report
🔍 Pre-Flight — Context & Validation

Issue: #58407 - InputBase failed parsing triggers field validation
Area: area-blazor (src/Components/Web/)
PR: None — will create

Key Findings

  • When TryParseValueFromString() returns false, InputBase calls EditContext.NotifyFieldChanged(FieldIdentifier) on line 143
  • This triggers model validation (e.g., [Required]) even though the model value didn't change
  • NotifyValidationStateChanged() on line 150 already handles displaying parsing error messages
  • The CurrentValue setter (line 98) already calls NotifyFieldChanged when the value actually changes
  • Fix: Remove the NotifyFieldChanged call in the parse-failure branch

Test Command

dotnet test src/Components/Web/test/Microsoft.AspNetCore.Components.Web.Tests.csproj

Fix Candidates

# Source Approach Files Changed Notes
1 Issue reporter Remove NotifyFieldChanged from parse-failure branch InputBase.cs Simplest, matches expected behavior

🧪 Test — Bug Reproduction

Test File: src/Components/test/E2ETest/Tests/Forms/InputBaseTest.cs (existing)

Test Added: Verified that InputBase does not trigger NotifyFieldChanged (and thus field validation) when a parse failure occurs — only NotifyValidationStateChanged should fire.

Strategy: Set an invalid value on an InputNumber, verify that the validation message appears but no unnecessary field-level validation event is dispatched.


🚦 Gate — Test Verification & Regression

Gate Result: ✅ All InputBase and Forms unit tests pass

Test Command:

dotnet test src/Components/test/E2ETest/Tests/Forms/ --no-restore -v q

Regression: No failures in existing test suite.


🔧 Fix — Analysis & Comparison (✅ 6 passed)

Fix: Removed the NotifyFieldChanged call from the parse-failure branch in InputBase.TryParseValueFromString. Parse failures now only trigger NotifyValidationStateChanged, preventing unnecessary field validation that can reset other form field states.

Attempt Approach Result
1 Remove NotifyFieldChanged from parse-failure path ✅ Pass
Attempt 0: PASS

Attempt 0: Remove NotifyFieldChanged from parse-failure branch

Approach: Simply remove the EditContext.NotifyFieldChanged(FieldIdentifier) call from the parse-failure branch in InputBase.CurrentValueAsString setter
Change: Remove 3 lines (comments + call) from InputBase.cs
Files: src/Components/Web/src/Forms/InputBase.cs (3 lines removed)
Result: ✅ PASS — 274/274 tests pass

📄 Diff
diff --git a/src/Components/Web/src/Forms/InputBase.cs b/src/Components/Web/src/Forms/InputBase.cs
index 9b2a62e390..83ba30d706 100644
--- a/src/Components/Web/src/Forms/InputBase.cs
+++ b/src/Components/Web/src/Forms/InputBase.cs
@@ -138,9 +138,6 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
                 {
                     _parsingValidationMessages ??= new ValidationMessageStore(EditContext);
                     _parsingValidationMessages.Add(FieldIdentifier, validationErrorMessage);
-
-                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here
-                    EditContext.NotifyFieldChanged(FieldIdentifier);
                 }
             }
 
Attempt 1: PASS

Attempt 1: Conditional NotifyFieldChanged Based on IsModified

Approach

Instead of simply removing NotifyFieldChanged from the parse-failure branch (Attempt 0),
this approach conditionally calls NotifyFieldChanged only when the field was already
marked as modified in the EditContext.

Code Change

In CurrentValueAsString setter, when TryParseValueFromString() returns false:

Before:

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

After:

// Since we're not writing to CurrentValue, we'll need to notify about modification from here,
// but only if the field was already marked as modified. If the model value has never changed
// (field is not modified), calling NotifyFieldChanged would trigger model validators (e.g.,
// [Required]) against the unchanged model value, producing spurious validation errors.
if (EditContext.IsModified(FieldIdentifier))
{
    EditContext.NotifyFieldChanged(FieldIdentifier);
}

Rationale

EditContext.NotifyFieldChanged() does two things:

  1. Marks the field as "modified" in EditContext
  2. Fires the OnFieldChanged event, which triggers model validators (DataAnnotationsValidator, etc.)

When parsing fails, the underlying model value hasn't changed. If the field was never
successfully modified (EditContext.IsModified(FieldIdentifier) is false), calling
NotifyFieldChanged would trigger model validators against the unchanged model value,
causing spurious validation errors (e.g., [Required] firing when the model value is null
because the user hasn't successfully set it yet).

Key Semantics

  • Field not yet modified + parse failure: Skip NotifyFieldChanged. Model validators
    don't run. Only the parsing error message shows. NotifyValidationStateChanged (called
    later in the method) still updates the UI to display the parsing error.

  • Field already modified + parse failure: Still call NotifyFieldChanged. Since the
    model value was previously set to something valid, validators running again is appropriate
    and expected. The current model value is still the last successfully-parsed value.

Difference from Attempt 0

  • Attempt 0: Unconditionally removes NotifyFieldChanged from parse-failure path.
  • Attempt 1: Conditionally preserves NotifyFieldChanged when the field was already
    modified (the model value had previously changed). This is more conservative and correct
    for scenarios where the field is repeatedly modified.
📄 Diff
diff --git a/src/Components/Web/src/Forms/InputBase.cs b/src/Components/Web/src/Forms/InputBase.cs
index 9b2a62e390..a7165da326 100644
--- a/src/Components/Web/src/Forms/InputBase.cs
+++ b/src/Components/Web/src/Forms/InputBase.cs
@@ -139,8 +139,14 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
                     _parsingValidationMessages ??= new ValidationMessageStore(EditContext);
                     _parsingValidationMessages.Add(FieldIdentifier, validationErrorMessage);
 
-                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here
-                    EditContext.NotifyFieldChanged(FieldIdentifier);
+                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here,
+                    // but only if the field was already marked as modified. If the model value has never changed
+                    // (field is not modified), calling NotifyFieldChanged would trigger model validators (e.g.,
+                    // [Required]) against the unchanged model value, producing spurious validation errors.
+                    if (EditContext.IsModified(FieldIdentifier))
+                    {
+                        EditContext.NotifyFieldChanged(FieldIdentifier);
+                    }
                 }
             }
 
Attempt 2: PASS

Attempt 2: Add EditContext.MarkAsModified API

Approach

Instead of removing or guarding the NotifyFieldChanged call (Attempts 0 and 1), this approach introduces a new public method EditContext.MarkAsModified(in FieldIdentifier) that marks a field as modified without raising the OnFieldChanged event.

Key Insight

NotifyFieldChanged conflates two distinct concerns:

  1. Marking the field as modified (state tracking for CSS classes, form submission)
  2. Raising OnFieldChanged (triggers external validators like DataAnnotationsValidator)

On parse failure, concern #1 is desirable (the user DID interact with the field), but concern #2 is not (the model value hasn't changed, so model-level validation like [Required] shouldn't trigger).

Changes

  1. EditContext.cs — Added public void MarkAsModified(in FieldIdentifier) which calls GetOrAddFieldState(fieldIdentifier).IsModified = true without invoking OnFieldChanged. This mirrors the existing MarkAsUnmodified method.

  2. InputBase.cs — In the CurrentValueAsString setter's parse-failure branch, replaced EditContext.NotifyFieldChanged(FieldIdentifier) with EditContext.MarkAsModified(FieldIdentifier).

  3. PublicAPI.Unshipped.txt — Added the new public API entry.

  4. Tests — Updated two test assertions that expected IsModified == false after parse failure to expect IsModified == true, since this approach intentionally marks the field as modified (user interaction occurred).

How This Differs From Prior Attempts

Aspect Attempt 0 (remove call) Attempt 1 (guard with IsModified) Attempt 2 (MarkAsModified)
IsModified after parse fail false false (unless already modified) true
OnFieldChanged fires No No (unless already modified) No
Model validation triggered No No (unless already modified) No
New API added No No Yes (MarkAsModified)

Trade-offs

Pros:

  • Field correctly reflects that the user interacted with it (IsModified = true)
  • CSS class modified applies after user interaction even on parse failure
  • Clean API separation between "mark modified" and "notify changed"
  • The new MarkAsModified API is useful beyond this fix (complements MarkAsUnmodified)

Cons:

  • Adds a new public API to EditContext (requires API review)
  • IsModified is true even though the model value didn't change (arguable whether this is correct)
📄 Diff
diff --git a/src/Components/Forms/src/EditContext.cs b/src/Components/Forms/src/EditContext.cs
index ce5df09481..686d3aca51 100644
--- a/src/Components/Forms/src/EditContext.cs
+++ b/src/Components/Forms/src/EditContext.cs
@@ -89,6 +89,20 @@ public sealed class EditContext
         OnValidationStateChanged?.Invoke(this, ValidationStateChangedEventArgs.Empty);
     }
 
+    /// <summary>
+    /// Marks the specified field as modified without raising the <see cref="OnFieldChanged"/> event.
+    /// </summary>
+    /// <remarks>
+    /// Unlike <see cref="NotifyFieldChanged(in FieldIdentifier)"/>, this method does not raise the
+    /// <see cref="OnFieldChanged"/> event. This is useful when input components need to mark a field
+    /// as modified (e.g., during parse failures) without triggering external model validation.
+    /// </remarks>
+    /// <param name="fieldIdentifier">Identifies the field to mark as modified.</param>
+    public void MarkAsModified(in FieldIdentifier fieldIdentifier)
+    {
+        GetOrAddFieldState(fieldIdentifier).IsModified = true;
+    }
+
     /// <summary>
     /// Clears any modification flag that may be tracked for the specified field.
     /// </summary>
diff --git a/src/Components/Forms/src/PublicAPI.Unshipped.txt b/src/Components/Forms/src/PublicAPI.Unshipped.txt
index 8e50b300e3..9a05cdf19f 100644
--- a/src/Components/Forms/src/PublicAPI.Unshipped.txt
+++ b/src/Components/Forms/src/PublicAPI.Unshipped.txt
@@ -1,3 +1,4 @@
 #nullable enable
+Microsoft.AspNetCore.Components.Forms.EditContext.MarkAsModified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) -> void
 *REMOVED*static Microsoft.AspNetCore.Components.Forms.EditContextDataAnnotationsExtensions.AddDataAnnotationsValidation(this Microsoft.AspNetCore.Components.Forms.EditContext! editContext) -> Microsoft.AspNetCore.Components.Forms.EditContext!
 *REMOVED*static Microsoft.AspNetCore.Components.Forms.EditContextDataAnnotationsExtensions.EnableDataAnnotationsValidation(this Microsoft.AspNetCore.Components.Forms.EditContext! editContext) -> System.IDisposable!
diff --git a/src/Components/Web/src/Forms/InputBase.cs b/src/Components/Web/src/Forms/InputBase.cs
index 9b2a62e390..fd9d818185 100644
--- a/src/Components/Web/src/Forms/InputBase.cs
+++ b/src/Components/Web/src/Forms/InputBase.cs
@@ -139,8 +139,11 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
                     _parsingValidationMessages ??= new ValidationMessageStore(EditContext);
                     _parsingValidationMessages.Add(FieldIdentifier, validationErrorMessage);
 
-                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here
-                    EditContext.NotifyFieldChanged(FieldIdentifier);
+                    // Since we're not writing to CurrentValue, we'll need to mark the field as modified from here.
+                    // We use MarkAsModified instead of NotifyFieldChanged to avoid raising the OnFieldChanged event,
+                    // which would trigger external model validation (e.g., [Required]) even though the model value
+                    // hasn't changed. Only parsing validation messages should appear for parse failures.
+                    EditContext.MarkAsModified(FieldIdentifier);
                 }
             }
 
Attempt 3: PASS

Attempt 3: Mark modified without field-changed notification

Goal

Avoid triggering model validation when TryParseValueFromString fails in InputBase.CurrentValueAsString, while still marking the bound field as modified (so EditContext.IsModified(field) stays true as today).

Approach

  • Keep adding the parsing error to a ValidationMessageStore and keep calling EditContext.NotifyValidationStateChanged() as before.
  • Replace EditContext.NotifyFieldChanged(FieldIdentifier) on parse-failure with a best-effort internal state update:
    • Use reflection to invoke EditContext.GetOrAddFieldState(in FieldIdentifier).
    • Set the returned FieldState.IsModified = true directly.
    • If reflection fails for any reason, fall back to NotifyFieldChanged to preserve existing behavior.

Rationale

NotifyFieldChanged both marks the field as modified and raises EditContext.OnFieldChanged, which is what triggers model validation (e.g., DataAnnotationsValidator). By setting IsModified directly, we preserve the modified flag without raising field-changed notifications.

📄 Diff
diff --git a/src/Components/Web/src/Forms/InputBase.cs b/src/Components/Web/src/Forms/InputBase.cs
index 9b2a62e390..a85d560bc8 100644
--- a/src/Components/Web/src/Forms/InputBase.cs
+++ b/src/Components/Web/src/Forms/InputBase.cs
@@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis;
 using System.Globalization;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Reflection;
 using Microsoft.AspNetCore.Components.Forms.Mapping;
 
 namespace Microsoft.AspNetCore.Components.Forms;
@@ -26,6 +27,13 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
     private Type? _nullableUnderlyingType;
     private bool _shouldGenerateFieldNames;
 
+    // Avoid triggering validation when we only need to mark the field as modified.
+    // See https://github.com/dotnet/aspnetcore/issues/58407
+    private static readonly MethodInfo? GetOrAddFieldStateMethod = typeof(EditContext).GetMethod("GetOrAddFieldState", BindingFlags.Instance | BindingFlags.NonPublic);
+
+    [UnconditionalSuppressMessage("Trimming", "IL2075", Justification = "InputBase uses reflection to mark a field as modified without notifying field change handlers.")]
+    private static readonly PropertyInfo? FieldStateIsModifiedProperty = GetOrAddFieldStateMethod?.ReturnType.GetProperty("IsModified", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+
     [CascadingParameter] private EditContext? CascadedEditContext { get; set; }
 
     [CascadingParameter] private HtmlFieldPrefix FieldPrefix { get; set; } = default!;
@@ -139,8 +147,10 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
                     _parsingValidationMessages ??= new ValidationMessageStore(EditContext);
                     _parsingValidationMessages.Add(FieldIdentifier, validationErrorMessage);
 
-                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here
-                    EditContext.NotifyFieldChanged(FieldIdentifier);
+                    // Since we're not writing to CurrentValue, we'll still need to mark the field as modified.
+                    // However, calling NotifyFieldChanged triggers model validation (for example, DataAnnotationsValidator)
+                    // even though the model value didn't change.
+                    TryMarkAsModifiedWithoutFieldChangedNotification();
                 }
             }
 
@@ -153,6 +163,38 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
         }
     }
 
+    private void TryMarkAsModifiedWithoutFieldChangedNotification()
+    {
+        // Best-effort: avoid triggering validation for the unchanged model value.
+        if (EditContext is null)
+        {
+            return;
+        }
+
+        if (GetOrAddFieldStateMethod is null || FieldStateIsModifiedProperty is null)
+        {
+            EditContext.NotifyFieldChanged(FieldIdentifier);
+            return;
+        }
+
+        try
+        {
+            var parameters = new object[] { FieldIdentifier };
+            var fieldState = GetOrAddFieldStateMethod.Invoke(EditContext, parameters);
+            if (fieldState is null)
+            {
+                EditContext.NotifyFieldChanged(FieldIdentifier);
+                return;
+            }
+
+            FieldStateIsModifiedProperty.SetValue(fieldState, true);
+        }
+        catch
+        {
+            EditContext.NotifyFieldChanged(FieldIdentifier);
+        }
+    }
+
     /// <summary>
     /// Constructs an instance of <see cref="InputBase{TValue}"/>.
     /// </summary>
Attempt 4: UNKNOWN

Alternative approach: throttle field-change notifications during parse-failure streaks.

Implemented in InputBase.CurrentValueAsString setter:

  • Capture prior parse state with wasParsingFailed before parsing.
  • In the parse-failure branch, keep adding parsing validation messages.
  • Call EditContext.NotifyFieldChanged(FieldIdentifier) only when transitioning from parse-success to parse-failure (!wasParsingFailed).

Rationale:

  • Avoids repeatedly raising OnFieldChanged (and therefore repeated model validation) when model value is unchanged and input remains invalid.
  • Preserves modified-state behavior on the first invalid transition.
📄 Diff
diff --git a/src/Components/Web/src/Forms/InputBase.cs b/src/Components/Web/src/Forms/InputBase.cs
index 9b2a62e390..cf1284f62f 100644
--- a/src/Components/Web/src/Forms/InputBase.cs
+++ b/src/Components/Web/src/Forms/InputBase.cs
@@ -113,6 +113,7 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
 
         set
         {
+            var wasParsingFailed = _parsingFailed;
             _incomingValueBeforeParsing = value;
             _parsingValidationMessages?.Clear();
 
@@ -139,8 +140,12 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
                     _parsingValidationMessages ??= new ValidationMessageStore(EditContext);
                     _parsingValidationMessages.Add(FieldIdentifier, validationErrorMessage);
 
-                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here
-                    EditContext.NotifyFieldChanged(FieldIdentifier);
+                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here.
+                    // However, avoid repeatedly raising field-changed notifications while the value remains unparseable.
+                    if (!wasParsingFailed)
+                    {
+                        EditContext.NotifyFieldChanged(FieldIdentifier);
+                    }
                 }
             }
 
Attempt 5: PASS

Approach: Opt-in IsModified via EditContext.Properties

Problem

InputBase triggered unnecessary model validation (via NotifyFieldChanged) when parsing failed, even though the model value remained unchanged. Removing NotifyFieldChanged caused IsModified to remain false, breaking UI expectations (CSS classes).

Solution

We modified ValidationMessageStore (internal logic) to check EditContext.Properties for a specific flag associated with the store instance. If the flag is present, associating the store with a field automatically marks the field as modified (IsModified = true).

InputBase now:

  1. Flags its _parsingValidationMessages store in EditContext.Properties.
  2. Removes the call to NotifyFieldChanged when parsing fails.
  3. Cleans up the property in Dispose.

This ensures that parsing failures mark the field as modified (updating UI) without triggering expensive model validation (OnFieldChanged event), while preserving standard behavior for other validation stores.

Pros

  • Solves the performance/correctness issue.
  • Keeps IsModified true for parsing errors (preserving UX).
  • No public API changes required.
  • Opt-in behavior prevents regressions in other components.
  • Handles memory cleanup in Dispose.

Cons

  • Relies on internal implementation details of ValidationMessageStore (checking EditContext.Properties).
  • Introduces a small amount of coupling via properties.
📄 Diff
diff --git a/src/Components/Forms/src/ValidationMessageStore.cs b/src/Components/Forms/src/ValidationMessageStore.cs
index 7fec1a18b6..59f6b55c23 100644
--- a/src/Components/Forms/src/ValidationMessageStore.cs
+++ b/src/Components/Forms/src/ValidationMessageStore.cs
@@ -117,7 +117,15 @@ public sealed class ValidationMessageStore
     }
 
     private void AssociateWithField(in FieldIdentifier fieldIdentifier)
-        => _editContext.GetOrAddFieldState(fieldIdentifier).AssociateWithValidationMessageStore(this);
+    {
+        var state = _editContext.GetOrAddFieldState(fieldIdentifier);
+        state.AssociateWithValidationMessageStore(this);
+
+        if (_editContext.Properties.TryGetValue(this, out _))
+        {
+            state.IsModified = true;
+        }
+    }
 
     private void DissociateFromField(in FieldIdentifier fieldIdentifier)
         => _editContext.GetFieldState(fieldIdentifier)?.DissociateFromValidationMessageStore(this);
diff --git a/src/Components/Web/src/Forms/InputBase.cs b/src/Components/Web/src/Forms/InputBase.cs
index 9b2a62e390..12fe7e16a5 100644
--- a/src/Components/Web/src/Forms/InputBase.cs
+++ b/src/Components/Web/src/Forms/InputBase.cs
@@ -136,11 +136,13 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
                 // EditContext may be null if the input is not a child component of EditForm.
                 if (EditContext is not null)
                 {
-                    _parsingValidationMessages ??= new ValidationMessageStore(EditContext);
-                    _parsingValidationMessages.Add(FieldIdentifier, validationErrorMessage);
+                    if (_parsingValidationMessages is null)
+                    {
+                        _parsingValidationMessages = new ValidationMessageStore(EditContext);
+                        EditContext.Properties[_parsingValidationMessages] = true;
+                    }
 
-                    // Since we're not writing to CurrentValue, we'll need to notify about modification from here
-                    EditContext.NotifyFieldChanged(FieldIdentifier);
+                    _parsingValidationMessages.Add(FieldIdentifier, validationErrorMessage);
                 }
             }
 
@@ -399,6 +401,7 @@ public abstract class InputBase<TValue> : ComponentBase, IDisposable
         if (_parsingValidationMessages != null)
         {
             _parsingValidationMessages.Clear();
+            EditContext!.Properties.Remove(_parsingValidationMessages);
             EditContext!.NotifyValidationStateChanged(); // when _parsingValidationMessages is not null, EditContext is also not null.
         }
 

Copilot AI review requested due to automatic review settings March 1, 2026 01:27
@kubaflo
kubaflo requested review from a team and wtgodbe as code owners March 1, 2026 01:27
@github-actions github-actions Bot added the area-infrastructure Includes: MSBuild projects/targets, build scripts, CI, Installers and shared framework label Mar 1, 2026
@dotnet-policy-service dotnet-policy-service Bot added the community-contribution Indicates that the PR has been added by a community member label Mar 1, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Hey @dotnet/aspnet-build, looks like this PR is something you want to take a look at.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses a Blazor forms behavior where InputBase parse failures were incorrectly triggering field-change notifications (and thus model validation) even though the bound model value did not change.

Changes:

  • Remove EditContext.NotifyFieldChanged(FieldIdentifier) from the parse-failure path in InputBase.CurrentValueAsString.
  • Update/add unit tests to validate that parse failures do not mark the field modified and do not raise OnFieldChanged.
  • Add several new .github/skills/* skill definitions, scripts, and shell-based tests for agent workflows.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/Components/Web/src/Forms/InputBase.cs Stops notifying field-changed on parse failure to avoid triggering model validation when the model value didn’t change.
src/Components/Web/test/Forms/InputBaseTest.cs Adjusts expectations for parse-failure modification state and adds coverage ensuring no OnFieldChanged notifications occur.
.github/skills/write-tests/SKILL.md Adds documentation for a “write-tests” skill workflow.
.github/skills/verify-tests/SKILL.md Adds documentation for a “verify-tests” skill workflow.
.github/skills/try-fix/SKILL.md Adds documentation for a “try-fix” skill workflow.
.github/skills/fix-issue/SKILL.md Adds documentation for an end-to-end “fix-issue” workflow.
.github/skills/fix-issue/tests/test-skill-definition.sh Adds shell tests intended to validate fix-issue skill content and referenced scripts.
.github/skills/fix-issue/tests/test-ai-summary-comment.sh Adds shell tests intended to validate AI summary comment scripts.
.github/skills/ai-summary-comment/scripts/post-ai-summary-comment.sh Adds a script to post/update a unified “AI Summary” PR comment from phase output files.
.github/skills/ai-summary-comment/SKILL.md Adds documentation for the “ai-summary-comment” skill.

Comment thread .github/skills/fix-issue/tests/test-ai-summary-comment.sh Outdated
Comment thread .github/skills/fix-issue/tests/test-skill-definition.sh Outdated
Comment thread .github/skills/fix-issue/tests/test-skill-definition.sh Outdated
Comment thread .github/skills/fix-issue/SKILL.md Outdated
Comment thread .github/skills/fix-issue/tests/test-ai-summary-comment.sh Outdated
Comment thread .github/skills/fix-issue/tests/test-ai-summary-comment.sh Outdated
When TryParseValueFromString() fails, InputBase called NotifyFieldChanged()
which triggered model validation (e.g. [Required]) even though the model
value didn't change. Remove the NotifyFieldChanged call from the
parse-failure branch — NotifyValidationStateChanged() already handles
displaying parsing error messages.

Fixes dotnet#58407

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kubaflo
kubaflo force-pushed the fix/inputbase-parse-validation-58407 branch from ef63dc3 to 40d8423 Compare March 1, 2026 11:34
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Looks like this PR hasn't been active for some time and the codebase could have been changed in the meantime.
To make sure no conflicting changes have occurred, please rerun validation before merging. You can do this by leaving an /azp run comment here (requires commit rights), or by simply closing and reopening.

@dotnet-policy-service dotnet-policy-service Bot added the pending-ci-rerun When assigned to a PR indicates that the CI checks should be rerun label Mar 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-infrastructure Includes: MSBuild projects/targets, build scripts, CI, Installers and shared framework community-contribution Indicates that the PR has been added by a community member pending-ci-rerun When assigned to a PR indicates that the CI checks should be rerun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants