diff --git a/src/bunit/Rendering/BunitRenderer.cs b/src/bunit/Rendering/BunitRenderer.cs
index 46c0ed095..646c008a9 100644
--- a/src/bunit/Rendering/BunitRenderer.cs
+++ b/src/bunit/Rendering/BunitRenderer.cs
@@ -447,15 +447,23 @@ protected override void ProcessPendingRender()
///
protected override Task UpdateDisplayAsync(in RenderBatch renderBatch)
{
+ var disposedComponentIds = new HashSet();
for (var i = 0; i < renderBatch.DisposedComponentIDs.Count; i++)
{
var id = renderBatch.DisposedComponentIDs.Array[i];
+ disposedComponentIds.Add(id);
returnedRenderedComponentIds.Remove(id);
}
for (var i = 0; i < renderBatch.UpdatedComponents.Count; i++)
{
var diff = renderBatch.UpdatedComponents.Array[i];
+
+ if (disposedComponentIds.Contains(diff.ComponentId))
+ {
+ continue;
+ }
+
var componentState = GetComponentState(diff.ComponentId);
var renderedComponent = (IRenderedComponent)componentState;
diff --git a/tests/bunit.testassets/SampleComponents/FormWithValidation.razor b/tests/bunit.testassets/SampleComponents/FormWithValidation.razor
new file mode 100644
index 000000000..7aeac0e07
--- /dev/null
+++ b/tests/bunit.testassets/SampleComponents/FormWithValidation.razor
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+@code {
+
+ [Parameter]
+ public bool Invoked { get; set; }
+
+ private Model model = new();
+
+ private void SetInvoked()
+ {
+ Invoked = true;
+ model = new Model();
+ }
+
+ public sealed class Model
+ {
+ public string? Title { get; set; }
+ }
+
+}
diff --git a/tests/bunit.tests/Rendering/RenderedComponentTest.cs b/tests/bunit.tests/Rendering/RenderedComponentTest.cs
index 798b517ea..2c1866495 100644
--- a/tests/bunit.tests/Rendering/RenderedComponentTest.cs
+++ b/tests/bunit.tests/Rendering/RenderedComponentTest.cs
@@ -244,6 +244,17 @@ public void Test024()
text.ShouldNotBeNull();
}
+
+ [Fact(DisplayName = "Form submission with DataAnnotationsValidator and model recreation works correctly")]
+ public void Test025()
+ {
+ var cut = Render();
+ cut.Find("#title").Change("title");
+
+ cut.Find("form").Submit();
+
+ cut.Instance.Invoked.ShouldBeTrue();
+ }
private class BaseComponent : ComponentBase
{