From 1b6f721648a500f59eda475564238e787a1967d8 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Wed, 3 Jul 2019 16:19:10 +0100 Subject: [PATCH] Don't try to unsubscribe from fixed cascading parameters. Fixes #11653 --- .../src/Rendering/ComponentState.cs | 6 +++- .../Components/test/CascadingParameterTest.cs | 32 +++++++++++++------ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Components/Components/src/Rendering/ComponentState.cs b/src/Components/Components/src/Rendering/ComponentState.cs index 7aace974a0..bc9b7e3277 100644 --- a/src/Components/Components/src/Rendering/ComponentState.cs +++ b/src/Components/Components/src/Rendering/ComponentState.cs @@ -165,7 +165,11 @@ namespace Microsoft.AspNetCore.Components.Rendering var numCascadingParameters = _cascadingParameters.Count; for (var i = 0; i < numCascadingParameters; i++) { - _cascadingParameters[i].ValueSupplier.Unsubscribe(this); + var supplier = _cascadingParameters[i].ValueSupplier; + if (!supplier.CurrentValueIsFixed) + { + supplier.Unsubscribe(this); + } } } } diff --git a/src/Components/Components/test/CascadingParameterTest.cs b/src/Components/Components/test/CascadingParameterTest.cs index f898fcb8eb..5f6a01e364 100644 --- a/src/Components/Components/test/CascadingParameterTest.cs +++ b/src/Components/Components/test/CascadingParameterTest.cs @@ -188,16 +188,25 @@ namespace Microsoft.AspNetCore.Components.Test var renderer = new TestRenderer(); var component = new TestComponent(builder => { - builder.OpenComponent>(0); - builder.AddAttribute(1, "Value", providedValue); - builder.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder => + // At the outer level, have an unrelated fixed cascading value to show we can deal with combining both types + builder.OpenComponent>(0); + builder.AddAttribute(1, "Value", 123); + builder.AddAttribute(2, "IsFixed", true); + builder.AddAttribute(3, RenderTreeBuilder.ChildContent, new RenderFragment(builder2 => { - if (displayNestedComponent) + // Then also have a non-fixed cascading value so we can show that unsubscription works + builder2.OpenComponent>(0); + builder2.AddAttribute(1, "Value", providedValue); + builder2.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(builder3 => { - childBuilder.OpenComponent>(0); - childBuilder.AddAttribute(1, "RegularParameter", "Goodbye"); - childBuilder.CloseComponent(); - } + if (displayNestedComponent) + { + builder3.OpenComponent>(0); + builder3.AddAttribute(1, "RegularParameter", "Goodbye"); + builder3.CloseComponent(); + } + })); + builder2.CloseComponent(); })); builder.CloseComponent(); }); @@ -219,7 +228,7 @@ namespace Microsoft.AspNetCore.Components.Test Assert.Equal(2, renderer.Batches.Count); var secondBatch = renderer.Batches[1]; Assert.Equal(1, nestedComponent.NumRenders); - Assert.Equal(2, secondBatch.DiffsByComponentId.Count); // Root + CascadingValue, but not nested one + Assert.Equal(3, secondBatch.DiffsByComponentId.Count); // Root + CascadingValue + CascadingValue, but not nested component // We *did* send updated params during the first render where it was removed, // because the params are sent before the disposal logic runs. We could avoid @@ -386,5 +395,10 @@ namespace Microsoft.AspNetCore.Components.Test builder.AddContent(0, $"CascadingParameter={CascadingParameter}; RegularParameter={RegularParameter}"); } } + + class SecondCascadingParameterConsumerComponent : CascadingParameterConsumerComponent + { + [CascadingParameter] T2 SecondCascadingParameter { get; set; } + } } }