I'm creating a survey generator that has the main Razor page called Survey
and then from here I add the element of the survey. The component is working if I create the survey from code. Each component is using HTML tag like
@inherits ElementBase<string>
<input type="@ElementData.TextboxType.GetDescription()"
name="@Name" placeholder="@ElementData.PlaceHolder"
@bind-value="@Value" class="form-control @CssInternal @CssClass">
All the custom components are derived from a ElementBase class that implements
[CascadingParameter] internal EditContext ElementEditContext { get; set; }
[CascadingParameter] internal Survey _survey { get; set; }
private FieldIdentifier _fieldIdentifier;
[Parameter]
public T Value
{
get
{
return _value;
}
set
{
_value = value;
_survey.SetElementValue(Name, _value);
}
}
[Parameter] public EventCallback<T> ValueChanged { get; set; }
[Parameter] public Expression<Func<T>> ValueExpression { get; set; }
protected override Task OnInitializedAsync()
{
if (ElementEditContext != null)
{
// omitted for simplicity
ElementEditContext.OnFieldChanged += FieldChanged;
ElementEditContext.OnValidationRequested += ValidationRequested;
}
_survey.ElementValuesChanged += SurveyGenerator_ElementValuesChanged;
return Task.CompletedTask;
}
In the Survey
page
<CascadingValue Value="this">
<EditForm EditContext="@editContext" OnValidSubmit="@ValidFormSubmitted">
<table class="table">
<tbody>
@for (int i = 0; i < Form.Elements.Count(); i++)
{
<tr>
<td>
<SurveyFieldGenerator
Element="@Form.Elements[i]" />
</td>
</tr>
}
@if (ChildContent != null)
{
@ChildContent
}
<tr>
<td colspan="2">
<button class="btn btn-primary"
@onclick="Submit">Submit</button>
</td>
</tr>
</tbody>
</table>
</EditForm>
</CascadingValue>
Now, I'm trying to use some components but from a Razor page and I added this code
<Survey ShowDebug="true">
<Survey.Components.Checkbox ElementData="@config" />
</Survey>
Here I get this error:
Unhandled exception rendering component: EditForm requires either a Model parameter, or an EditContext parameter, please provide one of these.
System.InvalidOperationException: EditForm requires either a Model parameter, or an EditContext parameter, please provide one of these.
at Microsoft.AspNetCore.Components.Forms.EditForm.OnParametersSet()
at Microsoft.AspNetCore.Components.ComponentBase.CallOnParametersSetAsync()
at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
I read the document Creating Bespoke Input Components for Blazor from Scratch and the post on Stackoverflow.
First, in the OnInitialized
raises immediately an error because ValueExpression
is null
.
protected override void OnInitialized()
{
_fieldIdentifier = FieldIdentifier.Create(ValueExpression);
}
So, how can I change my components or only the base class in order to fix this issue?