Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions src/Components/Web/src/Forms/InputHidden.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components.Rendering;

namespace Microsoft.AspNetCore.Components.Forms;

/// <summary>
/// An hidden input component for storing <see cref="string"/> values.
/// </summary>
public class InputHidden : InputBase<string?>
{
/// <summary>
/// Gets or sets the associated <see cref="ElementReference"/>.
/// <para>
/// May be <see langword="null"/> if accessed before the component is rendered.
/// </para>
/// </summary>
[DisallowNull] public ElementReference? Element { get; protected set; }

/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.OpenElement(0, "input");
builder.AddAttribute(1, "type", "hidden");
builder.AddMultipleAttributes(2, AdditionalAttributes);
builder.AddAttributeIfNotNullOrEmpty(3, "name", NameAttributeValue);
builder.AddAttributeIfNotNullOrEmpty(4, "class", CssClass);
builder.AddAttribute(5, "value", CurrentValueAsString);
builder.AddAttribute(6, "onchange", EventCallback.Factory.CreateBinder<string?>(this, __value => CurrentValueAsString = __value, CurrentValueAsString));
builder.SetUpdatesAttributeName("value");
builder.AddElementReferenceCapture(7, __inputReference => Element = __inputReference);
builder.CloseElement();
}

/// <inheritdoc />
protected override bool TryParseValueFromString(string? value, out string? result, [NotNullWhen(false)] out string? validationErrorMessage)
{
result = value;
validationErrorMessage = null;
return true;
}
}
6 changes: 6 additions & 0 deletions src/Components/Web/src/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
#nullable enable
Microsoft.AspNetCore.Components.Forms.InputHidden
Microsoft.AspNetCore.Components.Forms.InputHidden.Element.get -> Microsoft.AspNetCore.Components.ElementReference?
Microsoft.AspNetCore.Components.Forms.InputHidden.Element.set -> void
Microsoft.AspNetCore.Components.Forms.InputHidden.InputHidden() -> void
Microsoft.AspNetCore.Components.Web.Internal.IInternalWebJSInProcessRuntime.InvokeJS(in Microsoft.JSInterop.Infrastructure.JSInvocationInfo invocationInfo) -> string!
override Microsoft.AspNetCore.Components.Forms.InputHidden.BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder! builder) -> void
override Microsoft.AspNetCore.Components.Forms.InputHidden.TryParseValueFromString(string? value, out string? result, out string? validationErrorMessage) -> bool
virtual Microsoft.AspNetCore.Components.Routing.NavLink.ShouldMatch(string! uriAbsolute) -> bool
30 changes: 30 additions & 0 deletions src/Components/Web/test/Forms/InputHiddenTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace Microsoft.AspNetCore.Components.Forms;

public class InputHiddenTest
{
[Fact]
public async Task InputElementIsAssignedSuccessfully()
{
// Arrange
var model = new TestModel();
var rootComponent = new TestInputHostComponent<string, InputHidden>
{
EditContext = new EditContext(model),
ValueExpression = () => model.StringProperty,
};

// Act
var inputHiddenComponent = await InputRenderer.RenderAndGetComponent(rootComponent);

// Assert
Assert.NotNull(inputHiddenComponent.Element);
}

private class TestModel
{
public string StringProperty { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,23 @@ public void CanBindParameterToTheDefaultForm(bool suppressEnhancedNavigation)
DispatchToFormCore(dispatchToForm);
}

[Theory]
[InlineData(true)]
[InlineData(false)]
public void InputHiddenCanStoreData(bool suppressEnhancedNavigation)
{
var dispatchToForm = new DispatchToForm(this)
{
Url = "forms/default-form-input-hidden",
FormCssSelector = "form",
SuppressEnhancedNavigation = suppressEnhancedNavigation,
};
DispatchToFormCore(dispatchToForm);

Browser.Equal("stranger", () => Browser.Exists(By.Id("hidden")).GetDomProperty("value"));
Browser.Equal("Hello stranger!", () => Browser.Exists(By.Id("pass")).Text);
}

[Theory]
[InlineData(true)]
[InlineData(false)]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@page "/forms/default-form-input-hidden"
@page "/reexecution/forms/default-form-input-hidden"
@using Microsoft.AspNetCore.Components.Forms

<h2>Default form Input Hidden</h2>

<EditForm Enhance Model="Parameter" method="POST" OnValidSubmit="() => _submitted = true" FormName="someform">
<InputHidden id="hidden" @bind-Value="Parameter" />
<input id="send" type="submit" value="Send" />
</EditForm>

@if (_submitted)
{
<p id="pass">Hello @Parameter!</p>
}

@code {
bool _submitted = false;

[SupplyParameterFromForm] public string Parameter { get; set; } = "stranger";
}
Loading