Repository: MudBlazor/MudBlazor (2026-03-05T01:01:34Z)

Issue:
MudTextField: EditContext.OnFieldChanged fires on blur without value change
### Before reporting

- [x] I searched existing issues
- [x] I tried in private/incognito browser

### What went wrong?
We use a NavigationLock on all of our EditForms to prevent leaving with unsaved changed. The NavigationLock checks for a bool that is set by EditContext.OnFieldChanged and reset by OnValidSubmit.
With MudBlazor 9.0.0, the OnFieldChanged is called when unfocusing the MudTextField without any change. In previous versions, it was only called when the MudTextField was changed before unfocusing.

### Expected behavior
The OnFieldChanged on the EditContext should only be called when the MudTextField was changed before unfocusing.

### Reproduction link

https://try.mudblazor.com/snippet/QkmgEnkwwZeZQQVc

### Reproduction steps

1. Run the sample
2. Unfocus the MudTextField by clicking anywhere outside of the MudTextField
3. anyFieldChanged bool is set


### Version (bug)

v9.0.0

### Version (working)

v8.15.0

### Environment

Chrome

### Blazor rendering mode

WASM


Discussion:

Patch:
diff --git a/src/MudBlazor/Base/MudBaseInput.cs b/src/MudBlazor/Base/MudBaseInput.cs
index 57f23942aedc..ab3ee5d22f66 100644
--- a/src/MudBlazor/Base/MudBaseInput.cs
+++ b/src/MudBlazor/Base/MudBaseInput.cs
@@ -498,7 +498,7 @@ protected internal virtual async Task OnBlurredAsync(FocusEventArgs obj)
                     }
                     else
                     {
-                        await BeginValidateAsync();
+                        await ValidateValue();
                     }
                 }
             }
diff --git a/src/MudBlazor/Base/MudFormComponent.cs b/src/MudBlazor/Base/MudFormComponent.cs
index 16e5ca0cad92..9c10c98ef7fd 100644
--- a/src/MudBlazor/Base/MudFormComponent.cs
+++ b/src/MudBlazor/Base/MudFormComponent.cs
@@ -294,7 +294,7 @@ protected Task BeginValidationAfterAsync(Task task)
                 // if it has in fact changed, another validate call will follow anyway
                 if (EqualityComparer<T>.Default.Equals(value, ReadValue))
                 {
-                    await BeginValidateAsync();
+                    await ValidateValue();
                 }
             };
 


Test patch:
diff --git a/src/MudBlazor.UnitTests/Components/FormTests.cs b/src/MudBlazor.UnitTests/Components/FormTests.cs
index 90a47787d723..a4dd87a26305 100644
--- a/src/MudBlazor.UnitTests/Components/FormTests.cs
+++ b/src/MudBlazor.UnitTests/Components/FormTests.cs
@@ -408,6 +408,24 @@ await comp.WaitForAssertionAsync(() =>
             });
         }
 
+        /// <summary>
+        /// #12790: After changing any of the textfields with a For expression the corresponding chip should show a change message after the textfield blurred.
+        /// </summary>
+        [Test]
+        public async Task EditFormOnFieldChanged_BlurWithoutValueChange_ShouldNotNotify()
+        {
+            var comp = Context.Render<EditFormOnFieldChangedTest>();
+            var chips = comp.FindAll("span.mud-chip-content");
+            chips.Count.Should().Be(3);
+
+            await comp.FindAll("input")[0].BlurAsync();
+
+            chips = comp.FindAll("span.mud-chip-content");
+            chips[0].TextContent.Trim().Should().EndWith("not changed");
+            chips[1].TextContent.Trim().Should().EndWith("not changed");
+            chips[2].TextContent.Trim().Should().EndWith("not changed");
+        }
+
         /// <summary>
         /// After changing any of the textfields with a For expression the corresponding chip should show a change message after the textfield blurred.
         /// </summary>
@@ -2110,4 +2128,3 @@ public async Task ChildForm_TouchChangedPropagate()
         }
     }
 }
-