Skip to content

Commit 33e7a9a

Browse files
Introduce 'RenderTreeBuilder.AddComponentParameter()' (#46562)
1 parent 3119c78 commit 33e7a9a

24 files changed

+460
-210
lines changed

src/Components/Authorization/src/AuthorizeRouteView.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,19 @@ protected override void Render(RenderTreeBuilder builder)
7979
{
8080
// Otherwise, implicitly wrap the output in a <CascadingAuthenticationState>
8181
builder.OpenComponent<CascadingAuthenticationState>(0);
82-
builder.AddAttribute(1, nameof(CascadingAuthenticationState.ChildContent), _renderAuthorizeRouteViewCoreDelegate);
82+
builder.AddComponentParameter(1, nameof(CascadingAuthenticationState.ChildContent), _renderAuthorizeRouteViewCoreDelegate);
8383
builder.CloseComponent();
8484
}
8585
}
8686

8787
private void RenderAuthorizeRouteViewCore(RenderTreeBuilder builder)
8888
{
8989
builder.OpenComponent<AuthorizeRouteViewCore>(0);
90-
builder.AddAttribute(1, nameof(AuthorizeRouteViewCore.RouteData), RouteData);
91-
builder.AddAttribute(2, nameof(AuthorizeRouteViewCore.Authorized), _renderAuthorizedDelegate);
92-
builder.AddAttribute(3, nameof(AuthorizeRouteViewCore.Authorizing), _renderAuthorizingDelegate);
93-
builder.AddAttribute(4, nameof(AuthorizeRouteViewCore.NotAuthorized), _renderNotAuthorizedDelegate);
94-
builder.AddAttribute(5, nameof(AuthorizeRouteViewCore.Resource), Resource);
90+
builder.AddComponentParameter(1, nameof(AuthorizeRouteViewCore.RouteData), RouteData);
91+
builder.AddComponentParameter(2, nameof(AuthorizeRouteViewCore.Authorized), _renderAuthorizedDelegate);
92+
builder.AddComponentParameter(3, nameof(AuthorizeRouteViewCore.Authorizing), _renderAuthorizingDelegate);
93+
builder.AddComponentParameter(4, nameof(AuthorizeRouteViewCore.NotAuthorized), _renderNotAuthorizedDelegate);
94+
builder.AddComponentParameter(5, nameof(AuthorizeRouteViewCore.Resource), Resource);
9595
builder.CloseComponent();
9696
}
9797

@@ -104,8 +104,8 @@ private void RenderAuthorizeRouteViewCore(RenderTreeBuilder builder)
104104
private void RenderContentInDefaultLayout(RenderTreeBuilder builder, RenderFragment content)
105105
{
106106
builder.OpenComponent<LayoutView>(0);
107-
builder.AddAttribute(1, nameof(LayoutView.Layout), DefaultLayout);
108-
builder.AddAttribute(2, nameof(LayoutView.ChildContent), content);
107+
builder.AddComponentParameter(1, nameof(LayoutView.Layout), DefaultLayout);
108+
builder.AddComponentParameter(2, nameof(LayoutView.ChildContent), content);
109109
builder.CloseComponent();
110110
}
111111

src/Components/Authorization/test/AuthorizeRouteViewTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,11 +411,11 @@ public AuthorizeRouteViewWithExistingCascadedAuthenticationState(
411411
protected override void BuildRenderTree(RenderTreeBuilder builder)
412412
{
413413
builder.OpenComponent<CascadingValue<Task<AuthenticationState>>>(0);
414-
builder.AddAttribute(1, nameof(CascadingValue<object>.Value), _authenticationState);
415-
builder.AddAttribute(2, nameof(CascadingValue<object>.ChildContent), (RenderFragment)(builder =>
414+
builder.AddComponentParameter(1, nameof(CascadingValue<object>.Value), _authenticationState);
415+
builder.AddComponentParameter(2, nameof(CascadingValue<object>.ChildContent), (RenderFragment)(builder =>
416416
{
417417
builder.OpenComponent<AuthorizeRouteView>(0);
418-
builder.AddAttribute(1, nameof(AuthorizeRouteView.RouteData), _routeData);
418+
builder.AddComponentParameter(1, nameof(AuthorizeRouteView.RouteData), _routeData);
419419
builder.CloseComponent();
420420
}));
421421
builder.CloseComponent();

src/Components/Authorization/test/AuthorizeViewTest.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -505,13 +505,13 @@ private static TestAuthStateProviderComponent WrapInAuthorizeView(
505505
return new TestAuthStateProviderComponent(builder =>
506506
{
507507
builder.OpenComponent<AuthorizeView>(0);
508-
builder.AddAttribute(1, nameof(AuthorizeView.ChildContent), childContent);
509-
builder.AddAttribute(2, nameof(AuthorizeView.Authorized), authorized);
510-
builder.AddAttribute(3, nameof(AuthorizeView.NotAuthorized), notAuthorized);
511-
builder.AddAttribute(4, nameof(AuthorizeView.Authorizing), authorizing);
512-
builder.AddAttribute(5, nameof(AuthorizeView.Policy), policy);
513-
builder.AddAttribute(6, nameof(AuthorizeView.Roles), roles);
514-
builder.AddAttribute(7, nameof(AuthorizeView.Resource), resource);
508+
builder.AddComponentParameter(1, nameof(AuthorizeView.ChildContent), childContent);
509+
builder.AddComponentParameter(2, nameof(AuthorizeView.Authorized), authorized);
510+
builder.AddComponentParameter(3, nameof(AuthorizeView.NotAuthorized), notAuthorized);
511+
builder.AddComponentParameter(4, nameof(AuthorizeView.Authorizing), authorizing);
512+
builder.AddComponentParameter(5, nameof(AuthorizeView.Policy), policy);
513+
builder.AddComponentParameter(6, nameof(AuthorizeView.Roles), roles);
514+
builder.AddComponentParameter(7, nameof(AuthorizeView.Resource), resource);
515515
builder.CloseComponent();
516516
});
517517
}
@@ -531,11 +531,11 @@ public TestAuthStateProviderComponent(RenderFragment childContent)
531531
protected override void BuildRenderTree(RenderTreeBuilder builder)
532532
{
533533
builder.OpenComponent<CascadingValue<Task<AuthenticationState>>>(0);
534-
builder.AddAttribute(1, nameof(CascadingValue<Task<AuthenticationState>>.Value), AuthenticationState);
535-
builder.AddAttribute(2, "ChildContent", (RenderFragment)(builder =>
534+
builder.AddComponentParameter(1, nameof(CascadingValue<Task<AuthenticationState>>.Value), AuthenticationState);
535+
builder.AddComponentParameter(2, "ChildContent", (RenderFragment)(builder =>
536536
{
537537
builder.OpenComponent<NeverReRenderComponent>(0);
538-
builder.AddAttribute(1, "ChildContent", _childContent);
538+
builder.AddComponentParameter(1, "ChildContent", _childContent);
539539
builder.CloseComponent();
540540
}));
541541
builder.CloseComponent();

src/Components/Authorization/test/CascadingAuthenticationStateTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class UseCascadingAuthenticationStateComponent : AutoRenderComponent
177177
protected override void BuildRenderTree(RenderTreeBuilder builder)
178178
{
179179
builder.OpenComponent<CascadingAuthenticationState>(0);
180-
builder.AddAttribute(1, "ChildContent", new RenderFragment(childBuilder =>
180+
builder.AddComponentParameter(1, "ChildContent", new RenderFragment(childBuilder =>
181181
{
182182
childBuilder.OpenComponent<ReceiveAuthStateComponent>(0);
183183
childBuilder.CloseComponent();

src/Components/Components/src/DynamicComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void Render(RenderTreeBuilder builder)
9898
{
9999
foreach (var entry in Parameters)
100100
{
101-
builder.AddAttribute(1, entry.Key, entry.Value);
101+
builder.AddComponentParameter(1, entry.Key, entry.Value);
102102
}
103103
}
104104

src/Components/Components/src/LayoutView.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ private static RenderFragment WrapInLayout([DynamicallyAccessedMembers(Component
6969
void Render(RenderTreeBuilder builder)
7070
{
7171
builder.OpenComponent(0, layoutType);
72-
builder.AddAttribute(1, LayoutComponentBase.BodyPropertyName, bodyParam);
72+
builder.AddComponentParameter(1, LayoutComponentBase.BodyPropertyName, bodyParam);
7373
builder.CloseComponent();
7474
};
7575

src/Components/Components/src/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
Microsoft.AspNetCore.Components.ComponentBase.DispatchExceptionAsync(System.Exception! exception) -> System.Threading.Tasks.Task!
33
Microsoft.AspNetCore.Components.RenderHandle.DispatchExceptionAsync(System.Exception! exception) -> System.Threading.Tasks.Task!
44
*REMOVED*Microsoft.AspNetCore.Components.NavigationManager.ToAbsoluteUri(string! relativeUri) -> System.Uri!
5-
Microsoft.AspNetCore.Components.NavigationManager.ToAbsoluteUri(string? relativeUri) -> System.Uri!
5+
Microsoft.AspNetCore.Components.NavigationManager.ToAbsoluteUri(string? relativeUri) -> System.Uri!
6+
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.AddComponentParameter(int sequence, string! name, object? value) -> void

src/Components/Components/src/Rendering/RenderTreeBuilder.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,18 @@ public void OpenComponent(int sequence, [DynamicallyAccessedMembers(Component)]
505505
OpenComponentUnchecked(sequence, componentType);
506506
}
507507

508+
/// <summary>
509+
/// Appends a frame representing a component parameter.
510+
/// </summary>
511+
/// <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
512+
/// <param name="name">The name of the attribute.</param>
513+
/// <param name="value">The value of the attribute.</param>
514+
public void AddComponentParameter(int sequence, string name, object? value)
515+
{
516+
AssertCanAddComponentParameter();
517+
_entries.AppendAttribute(sequence, name, value);
518+
}
519+
508520
/// <summary>
509521
/// Assigns the specified key value to the current element or component.
510522
/// </summary>
@@ -649,6 +661,14 @@ private void AssertCanAddAttribute()
649661
}
650662
}
651663

664+
private void AssertCanAddComponentParameter()
665+
{
666+
if (_lastNonAttributeFrameType != RenderTreeFrameType.Component)
667+
{
668+
throw new InvalidOperationException($"Component parameters may only be added immediately after frames of type {RenderTreeFrameType.Component}");
669+
}
670+
}
671+
652672
private int? GetCurrentParentFrameIndex()
653673
=> _openElementIndices.Count == 0 ? (int?)null : _openElementIndices.Peek();
654674

src/Components/Components/src/RouteView.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ protected virtual void Render(RenderTreeBuilder builder)
8181
?? DefaultLayout;
8282

8383
builder.OpenComponent<LayoutView>(0);
84-
builder.AddAttribute(1, nameof(LayoutView.Layout), pageLayoutType);
85-
builder.AddAttribute(2, nameof(LayoutView.ChildContent), _renderPageWithParametersDelegate);
84+
builder.AddComponentParameter(1, nameof(LayoutView.Layout), pageLayoutType);
85+
builder.AddComponentParameter(2, nameof(LayoutView.ChildContent), _renderPageWithParametersDelegate);
8686
builder.CloseComponent();
8787
}
8888

@@ -92,7 +92,7 @@ private void RenderPageWithParameters(RenderTreeBuilder builder)
9292

9393
foreach (var kvp in RouteData.RouteValues)
9494
{
95-
builder.AddAttribute(1, kvp.Key, kvp.Value);
95+
builder.AddComponentParameter(1, kvp.Key, kvp.Value);
9696
}
9797

9898
var queryParameterSupplier = QueryParameterValueSupplier.ForType(RouteData.PageType);

src/Components/Components/src/Routing/QueryParameterValueSupplier.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public void RenderParametersFromQueryString(RenderTreeBuilder builder, ReadOnlyM
5858
{
5959
ref var destination = ref _destinations[destinationIndex];
6060
var blankValue = destination.IsArray ? destination.Parser.ParseMultiple(default, string.Empty) : null;
61-
builder.AddAttribute(0, destination.ComponentParameterName, blankValue);
61+
builder.AddComponentParameter(0, destination.ComponentParameterName, blankValue);
6262
}
6363
return;
6464
}
@@ -101,7 +101,7 @@ public void RenderParametersFromQueryString(RenderTreeBuilder builder, ReadOnlyM
101101
? default
102102
: destination.Parser.Parse(values[0].Span, destination.ComponentParameterName);
103103

104-
builder.AddAttribute(0, destination.ComponentParameterName, parsedValue);
104+
builder.AddComponentParameter(0, destination.ComponentParameterName, parsedValue);
105105
}
106106
}
107107
finally

0 commit comments

Comments
 (0)