I can't figure out how to highlight invalid fields and display individual ValidationMessages for nested components. The same code when added to the page works as expected, but when moved to a separate component the page's ValidationSummary displays errors for this component just fine, but component itself does not provide any validation results.
I did an extensive search and I only found topics about validation of complex models, but nothing about displaying validation information in nested components. This suggests that I am probably missing something simple, but I can't figure out what this is.
Here is the simplified code reproducing this behavior.
Product.cs
public class Product
{
public int Id { get; set; }
[Required(ErrorMessage = "Added On Date is required")]
public DateTime? AddedOn { get; set; }
[Required(ErrorMessage = "Product Name is required")]
public string Name { get; set; }
public int BrandId { get; set; }
public int ManufacturerId { get; set; }
}
ChildComponent.razor
<div class="card">
<div class="card-header">
@(new MarkupString(Caption))
</div>
<div class="card-body">
<input type="text" @bind-value=@TextValue />
<ValidationMessage For=@(() => TextValue) />
<input type="datetime-local" @bind-value=@DateValue />
<ValidationMessage For=@(() => DateValue) />
</div>
</div>
@code {
[Parameter]
public string Caption { get; set; }
[Parameter]
public string TextValue { get; set; }
[Parameter]
public DateTime? DateValue { get; set; }
}
TestPage.razor
@page "/test"
<EditForm OnValidSubmit="HandleFormSubmit" Model="@ProductModel">
<DataAnnotationsValidator />
@*ValidationMessages are returned/displayed*@
<div class="card">
<div class="card-header">
Control on the Page
</div>
<div class="card-body">
<input type="text" @bind-value=@ProductModel.Name />
<ValidationMessage For=@(() => ProductModel.Name) />
<input type="datetime-local" @bind-value=@ProductModel.AddedOn />
<ValidationMessage For=@(() => ProductModel.AddedOn) />
</div>
</div>
@*ValidationMessages are NOT returned/displayed*@
<ChildComponent Caption="Nested Component"
DateValue=@ProductModel.AddedOn
TextValue=@ProductModel.Name />
@*ValidationSummary displays errors as expected*@
<ValidationSummary />
<input type="submit" value="Save" class="btn btn-primary" />
</EditForm>
@code {
Product ProductModel = new Product();
private async Task HandleFormSubmit(EditContext context) { }
}
EDIT:
Using info from the link provided by @NeilW I am now able to change the CSS of input controls (red border when invalid, green when valid), but I am still not able to display ValidationMessages for invalid controls. Any suggestions?