I want to wrap Blazor's EditForm
component so that I can add some additional functionality.
Also, I'm creating input components that inherit from InputBase<T>
for added features/functionality/ease of use.
When I use my custom inputs in Blazor's EditForm
, the Model
gets updated properly. However, when I use my wrapper for EditForm
, the Model
does not get updated. If I use Blazor's InputText
component in my wrapper, the Model
gets updated properly.
The code (edited for brevity):
BfForm.razor (the wrapper):
@using Microsoft.AspNetCore.Components.Forms
<EditForm Model="Model" OnInvalidSubmit="OnInvalidSubmit" OnValidSubmit="OnValidSubmit" novalidate>
<DataAnnotationsValidator />
<ValidationSummary />
@ChildContent
</EditForm>
@code{
//This displays the ChildContent as expected, validation works, but the Model does not get updated
[EditorRequired, Parameter] public RenderFragment ChildContent { get; set; }
// When I use this, I get a .ToString(), i.e.
// Microsoft.AspNetCore.Components.RenderFragment`1[Microsoft.AspNetCore.Components.Forms.EditContext]
//[EditorRequired, Parameter] public RenderFragment<EditContext> ChildContent { get; set; }
[EditorRequired, Parameter] public Object Model { get; set; }
[EditorRequired, Parameter] public EventCallback OnInvalidSubmit { get; set; }
[EditorRequired, Parameter] public EventCallback OnValidSubmit { get; set; }
}
BfText.razor:
@inherits InputBase<string>
@* I've tried using Microsoft's InputText with @bind-Value and @bind as well as @bind-value *@
<input
type="text"
@attributes="AdditionalAttributes"
@bind-value="CurrentValue" />
@code {
protected override bool TryParseValueFromString(string value, out string result, out string validationErrorMessage)
{
result = value;
validationErrorMessage = null;
return true;
}
}
And the usage:
<BfForm Model="model" OnInvalidSubmit="invalidSubmit" OnValidSubmit="validSubmit">
<BfText DisplayName="First name" @bind-Value="model.FirstName" />
@* When I use this, the Model does update *@
<InputText @bind-Value="model.FirstName" />
<p>fname: @model.FirstName</p>
<input type="submit" />
</BfForm>
As mentioned in the comments, if I use RenderFragment<EditContext>
in BfForm.razor
, nothing gets rendered, instead I see Microsoft.AspNetCore.Components.RenderFragment``1[Microsoft.AspNetCore.Components.Forms.EditContext]
.
However, if I use RenderFragment
, the inputs get rendered, but the Model
doesn't get updated.
And in BfText.razor
, I've tried using Blazor's InputText
component with the @bind-Value
attribute, an html input element with both @bind=
and @bind-value
and the Model
does not get updated in any cases.
Finally, when using my BfForm
component, if I use Blazor's InputText
component, the Model
does indeed get updated.
Not sure what I'm doing wrong here. Since I'm inheriting from InputBase<string>
seems like my BfText
component should be grabbing the EditForm
's CascadingValue
.
I've got the source code sitting in a class library on github.
For convenience, here's the source code for EditForm
, InputBase
, and InputText
Any help appreciated.
Here's my attempt to simplify your code to help isolate the issue. This code works, so what are you doing that's different?
MyInput.razor
MyForm.razor
Index.razor