i know this is a common problem, but none of the solutions resolved my issue. All explanations seemed logical at first but after implementing them it did absolutely nothing and im kinda at a loss here.
Nothing I do to lets me update my UI component and just display some error messages which come from DataAnnotation attributes. I am manually checking my data model for validity and in the case of being invalid I’m updating a list of error messages which in turn should be displayed inside my UI.
This is my component:
<GridEditSettings AllowAdding="true" AllowEditing="true" AllowDeleting="true" Mode="EditMode.Dialog" Dialog="DialogParams" ShowConfirmDialog="true">
<Validator>
<DataAnnotationsValidator></DataAnnotationsValidator>
</Validator>
<Template>
@{
var unknownItem = (context as unknownasgdata);
<div>
@if (validationResults.Any())
{
<div class="validation-summary">
@foreach (var validationResult in validationResults)
{
<div>@validationResult.ErrorMessage</div>
}
</div>
}
<br/>
<div class="form-row">
<div class="form-group col-md-6">
<label><b>Bezeichnung</b></label><br />
@(unknownItem.description)
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label><b>Betriebsstätte</b></label><br />
@(unknownItem.house)
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label><b>Leistungsnummer</b></label><br />
@(unknownItem.leinr)
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label><b>Preis</b></label><br />
<SfNumericTextBox @bind-Value="@(unknownItem.articleprice)" ></SfNumericTextBox>
</div>
</div>
<br/>
<div class="form-row">
<div class="form-group col-md-6">
<label><b>Mahlzeitart</b></label><br/>
<SfDropDownList TValue="string" TItem="string" DataSource="@(new List<string> { "Frühstück", "Mittagessen", "Abendessen" })" @bind-Value="@(unknownItem.selectedMahlzeit)"></SfDropDownList>
</div>
</div>
</div>
}
</Template>
<FooterTemplate>
<SfButton OnClick="@SubmitForm" IsPrimary="true">Speichern</SfButton>
<SfButton OnClick="Cancel">Abbrechen</SfButton>
</FooterTemplate>
</GridEditSettings>
@code{
private async Task<bool> ValidateModel()
{
validationResults.Clear();
bool isValid = Validator.TryValidateObject(unknownItem, validationContext, validationResults, true);
Task.Delay(3000);
return isValid;
}
private async Task SubmitForm()
{
if (await ValidateModel())
{
// Proceed with database updates
// Your database update logic here
}
else
{
// Handle validation failures
// Show validation messages
validationResults = new List<ValidationResult>(validationResults);
await Task.Delay(3000);
await InvokeAsync(() =>
{
StateHasChanged(); // Ensure the UI is updated to reflect validation errors
});
await Task.Yield();
}
}
}
There is, of course, a bit of code missing here and there that is important to the class but you can just assume that the basics like initializing variables are working. What I am trying to do is just Submitting my Form and doing a Validation beforehand. ValidateModel() populates the List validationResults which I want to display in my razor component. In theory, shouldn’t the component re render as soon as I update the List, since I am checking for elements inside my razor components? I tried calling StateHasChanged multiple times sync and async and using Task.Delay whenever I can but nothing works and nothing lets me update the UI.
ComfortableOnion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.