Я работаю над преобразованием приложения RazorPages в рендеринг сервера Blazor, приложение на самом деле представляет собой просто пользовательский интерфейс, весь доступ к данным / манипуляции с ними выполняются через API. При выполнении операций CRUD API возвращает набор объектов ошибок в стандартизированном формате.
У меня есть код в приложении RazorPages для преобразования коллекции ошибок в элементы в ModelStateDictionary, и он работает должным образом. Отображаются сообщения, и я могу вносить изменения и повторно отправлять форму.
Я добавил аналогичный код в приложение Blazor, чтобы добавить его в EditContext, но я изо всех сил пытаюсь понять, как очистить сообщения проверки, которые были добавлены моим методом расширения. Я изучал этот вопрос и все предлагаемые решения, но, похоже, у меня ничего не работает: Как сбросить пользовательские ошибки проверки при использовании editform на странице blazor razor
Это метод, который фактически выполняет манипуляции с EditContext:
private static void AddErrors(EditContext editContext, Dictionary<string, List<string>> errorDictionary)
{
if (errorDictionary != null && errorDictionary.Any())
{
var validationMessageStore = new ValidationMessageStore(editContext);
foreach (var error in errorDictionary)
{
validationMessageStore.Add(editContext.Field(error.Key), error.Value);
}
editContext.NotifyValidationStateChanged();
}
}
Вот определение формы:
<EditForm class="form-signin" OnValidSubmit="OnSubmit" Model="loginModel" Context="CurrentEditContext">
<DataAnnotationsValidator />
<SummaryOnlyValidationSummary />
<div class="form-group">
<InputText id="inputUsername" class="form-control" @bind-Value="loginModel.Username" autofocus placeholder="Username" @onkeyup="@(q => ResetValidation(CurrentEditContext))" />
<ValidationMessage For="@(() => loginModel.Username)" />
</div>
<div class="form-group">
<InputText type="password" id="inputPassword" class="form-control" placeholder="Password" @bind-Value="loginModel.Password" />
<ValidationMessage For="@(() => loginModel.Password)" />
</div>
<div class="form-group">
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</div>
</EditForm>
Это сигнатура метода, когда форма отправляется, и переданный editContext выглядит точным на основе сообщений проверки, которые он содержит (сообщения из обязательных атрибутов в свойствах модели верны):
protected async Task OnSubmit(EditContext editContext)
SummaryOnlyValidationSummary - это настраиваемый компонент, который работает так же, как и стандартный ValidationSummary, за исключением того, что исключает любое сообщение, которое уже отображается DataAnnotationsValidator.
Я неправильно добавляю сообщения? Если да, то есть ли какие-нибудь хорошие рекомендации относительно того, где я ошибся? Если нет, кто-нибудь знает, как правильно очистить или сбросить сообщения проверки? Я пытался всегда отправлять форму, не только когда она действительна, но даже принудительное использование editContext.Validate () не очищает сообщение проверки, добавленное моим кодом. Если это вообще помогает, в ResetValidation я создаю новый экземпляр ValidationMessageStore вне текущего editContext, и он не содержит никаких сообщений (хотя не уверен, каково ожидаемое поведение).