Skip to content

Commit ea282bf

Browse files
authored
Add an InputHidden component for Blazor (#62626)
1 parent f469cdc commit ea282bf

File tree

5 files changed

+118
-0
lines changed

5 files changed

+118
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Diagnostics.CodeAnalysis;
5+
using Microsoft.AspNetCore.Components.Rendering;
6+
7+
namespace Microsoft.AspNetCore.Components.Forms;
8+
9+
/// <summary>
10+
/// An hidden input component for storing <see cref="string"/> values.
11+
/// </summary>
12+
public class InputHidden : InputBase<string?>
13+
{
14+
/// <summary>
15+
/// Gets or sets the associated <see cref="ElementReference"/>.
16+
/// <para>
17+
/// May be <see langword="null"/> if accessed before the component is rendered.
18+
/// </para>
19+
/// </summary>
20+
[DisallowNull] public ElementReference? Element { get; protected set; }
21+
22+
/// <inheritdoc />
23+
protected override void BuildRenderTree(RenderTreeBuilder builder)
24+
{
25+
builder.OpenElement(0, "input");
26+
builder.AddAttribute(1, "type", "hidden");
27+
builder.AddMultipleAttributes(2, AdditionalAttributes);
28+
builder.AddAttributeIfNotNullOrEmpty(3, "name", NameAttributeValue);
29+
builder.AddAttributeIfNotNullOrEmpty(4, "class", CssClass);
30+
builder.AddAttribute(5, "value", CurrentValueAsString);
31+
builder.AddAttribute(6, "onchange", EventCallback.Factory.CreateBinder<string?>(this, __value => CurrentValueAsString = __value, CurrentValueAsString));
32+
builder.SetUpdatesAttributeName("value");
33+
builder.AddElementReferenceCapture(7, __inputReference => Element = __inputReference);
34+
builder.CloseElement();
35+
}
36+
37+
/// <inheritdoc />
38+
protected override bool TryParseValueFromString(string? value, out string? result, [NotNullWhen(false)] out string? validationErrorMessage)
39+
{
40+
result = value;
41+
validationErrorMessage = null;
42+
return true;
43+
}
44+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
#nullable enable
2+
Microsoft.AspNetCore.Components.Forms.InputHidden
3+
Microsoft.AspNetCore.Components.Forms.InputHidden.Element.get -> Microsoft.AspNetCore.Components.ElementReference?
4+
Microsoft.AspNetCore.Components.Forms.InputHidden.Element.set -> void
5+
Microsoft.AspNetCore.Components.Forms.InputHidden.InputHidden() -> void
26
Microsoft.AspNetCore.Components.Web.Internal.IInternalWebJSInProcessRuntime.InvokeJS(in Microsoft.JSInterop.Infrastructure.JSInvocationInfo invocationInfo) -> string!
7+
override Microsoft.AspNetCore.Components.Forms.InputHidden.BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder! builder) -> void
8+
override Microsoft.AspNetCore.Components.Forms.InputHidden.TryParseValueFromString(string? value, out string? result, out string? validationErrorMessage) -> bool
39
virtual Microsoft.AspNetCore.Components.Routing.NavLink.ShouldMatch(string! uriAbsolute) -> bool
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
namespace Microsoft.AspNetCore.Components.Forms;
5+
6+
public class InputHiddenTest
7+
{
8+
[Fact]
9+
public async Task InputElementIsAssignedSuccessfully()
10+
{
11+
// Arrange
12+
var model = new TestModel();
13+
var rootComponent = new TestInputHostComponent<string, InputHidden>
14+
{
15+
EditContext = new EditContext(model),
16+
ValueExpression = () => model.StringProperty,
17+
};
18+
19+
// Act
20+
var inputHiddenComponent = await InputRenderer.RenderAndGetComponent(rootComponent);
21+
22+
// Assert
23+
Assert.NotNull(inputHiddenComponent.Element);
24+
}
25+
26+
private class TestModel
27+
{
28+
public string StringProperty { get; set; }
29+
}
30+
}

src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,23 @@ public void CanBindParameterToTheDefaultForm(bool suppressEnhancedNavigation)
104104
DispatchToFormCore(dispatchToForm);
105105
}
106106

107+
[Theory]
108+
[InlineData(true)]
109+
[InlineData(false)]
110+
public void InputHiddenCanStoreData(bool suppressEnhancedNavigation)
111+
{
112+
var dispatchToForm = new DispatchToForm(this)
113+
{
114+
Url = "forms/default-form-input-hidden",
115+
FormCssSelector = "form",
116+
SuppressEnhancedNavigation = suppressEnhancedNavigation,
117+
};
118+
DispatchToFormCore(dispatchToForm);
119+
120+
Browser.Equal("stranger", () => Browser.Exists(By.Id("hidden")).GetDomProperty("value"));
121+
Browser.Equal("Hello stranger!", () => Browser.Exists(By.Id("pass")).Text);
122+
}
123+
107124
[Theory]
108125
[InlineData(true)]
109126
[InlineData(false)]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
@page "/forms/default-form-input-hidden"
2+
@page "/reexecution/forms/default-form-input-hidden"
3+
@using Microsoft.AspNetCore.Components.Forms
4+
5+
<h2>Default form Input Hidden</h2>
6+
7+
<EditForm Enhance Model="Parameter" method="POST" OnValidSubmit="() => _submitted = true" FormName="someform">
8+
<InputHidden id="hidden" @bind-Value="Parameter" />
9+
<input id="send" type="submit" value="Send" />
10+
</EditForm>
11+
12+
@if (_submitted)
13+
{
14+
<p id="pass">Hello @Parameter!</p>
15+
}
16+
17+
@code {
18+
bool _submitted = false;
19+
20+
[SupplyParameterFromForm] public string Parameter { get; set; } = "stranger";
21+
}

0 commit comments

Comments
 (0)