#.net-core #blazor #submit #fluentvalidation #blazor-editform
Вопрос:
В проекте blazor я использовал Editform
and Fluentvalidation
, а также пояс для инструментов.Блейзор.Горячие клавиши для сочетания клавиш (ctrl s) для отправки формы При нажатии ctrl s вызывается метод отправки (), но если в форме есть ошибка, она не отображает ошибки. На самом деле вызывается только метод, а не форма отправки. Какое решение вы предлагаете для этой проблемы?
<EditForm Model="@model" OnValidSubmit="Submit">
<FluentValidationValidator />
...
<button type="submit" >save</button>
</EditForm>
@code
{
[Parameter] public CategoryInfo model { get; set; } = new();
private async Task Submit()
{
var validator = new CategoryValidator();
var result = validator.Validate(model);
if (result.IsValid)
{
...
}
}
}
Комментарии:
1. Пожалуйста, вы можете опубликовать свой код настройки горячей клавиши для компонента. Я предполагаю, что вы связали горячую клавишу с
Submit
методом, который на самом деле не отправляет форму.2. @MrCakaShaunCurtis да, я просто вызываю метод отправки, и я пытался
_editContext.Validate()
, но он всегда возвращалсяtrue
3. если
_editContext.Validate()
возвращает значение true, то модель проверяется. Если есть ошибки, о которых не сообщается, значит, что-то не так с вашим кодом проверки Fluent.
Ответ №1:
Вот рабочий одностраничный компонент, демонстрирующий код, необходимый для реализации отправки формы <CTL>S
. Я использовал DataAnnotationsValidator
его для простоты. Существуют встроенные комментарии, объясняющие методы.
@page "/"
@implements IDisposable
@using Toolbelt.Blazor.HotKeys
@using System.ComponentModel.DataAnnotations;
<h3>EditForm</h3>
<EditForm EditContext="this._editContext" OnValidSubmit="ValidSubmitForm" OnInvalidSubmit="InvalidSubmitForm">
<DataAnnotationsValidator />
<div class="p-2">
<span>Value (100-200):</span>
<InputNumber @bind-Value="_model.Value" />
<ValidationMessage For="() => _model.Value"/>
</div>
<div class="m-2 p-2">
<button class="btn btn-success" type="submit">Submit</button>
</div>
</EditForm>
<div class="m-2 p-2">
<span>@message</span>
</div>
<div class="m-2 p-2">
<button class="btn btn-danger" type="button" @onclick="SubmitFormExternally">Submit Form Externally</button>
</div>
@code {
private string message;
private Model _model = new Model();
[Inject] private HotKeys hotKeys { get; set; }
private HotKeysContext _hotKeysContext;
EditContext _editContext;
// Explicitly setup the Edit context so we have a reference to it
protected override void OnInitialized()
{
_editContext = new EditContext(_model);
_hotKeysContext = this.hotKeys.CreateContext()
.Add(ModKeys.Ctrl, Keys.S, SubmitFormCtlS, "Submit form");
}
// Invalid handler
private Task ValidSubmitForm()
{
message = $"Valid Form Submitted at :{DateTime.Now.ToLongTimeString()}";
return Task.CompletedTask;
}
// Valid Handler
private Task InvalidSubmitForm()
{
message = $" Invalid Form Submitted at :{DateTime.Now.ToLongTimeString()}";
return Task.CompletedTask;
}
// Method to call from external button
// Works and component updates as it's a Blazor Component event
// emulates the private HandleSubmitAsync method in EditForm
private async Task SubmitFormExternally()
{
if (_editContext.Validate())
await this.ValidSubmitForm();
else
await this.InvalidSubmitForm();
}
// Method to call from shortcut key
// The shortcut key mechanism does't wrap the call in a Blazor Component event
// So we wrap the code within one
// The code emulates the private HandleSubmitAsync method in EditForm
private async Task SubmitFormCtlS()
{
var task = Task.CompletedTask;
if (_editContext.Validate())
task = this.ValidSubmitForm();
else
task = this.InvalidSubmitForm();
this.StateHasChanged();
if (!task.IsCompleted || task.IsCanceled)
{
await task;
this.StateHasChanged();
}
}
public void Dispose()
{
_hotKeysContext.Dispose();
}
// Quick Model Class
public class Model
{
[Range(100, 200, ErrorMessage = "Must be between 100 and 200")]
public int Value { get; set; } = 0;
}
}
Комментарии:
1. Спасибо, но я использую
FluentValidationValidator
🙂2. То же самое. Замените
DataAnnotationsValidator
наFluentValidationValidator
и выполните проверку вашей модели. Я использовалDataAnnotationsValidator
, потому что я могу сохранить весь демо-код вместе, и он очень прост в использовании в демо-версии.