Apariencia
Caso de uso: formulario interactivo
Anterior: validación contextual · Casos de uso · Siguiente: opciones
Una sesión de formulario coordina ediciones sucesivas. Aplica debounce, cancela la operación anterior y publica únicamente la versión vigente.
Flujo de edición
text
Usuario escribe A
↓ UpdateWithResultAsync(A)
↓ Pending + debounce
Usuario escribe B
↓ cancela A
↓ UpdateWithResultAsync(B)
↓ Pending → Valid / Invalid / Failed / Canceled
↓
Changed publica B si continúa vigenteUpdateWithResultAsync se usa durante edición y aplica el debounce configurado. EvaluateAsync evalúa inmediatamente y resulta apropiado para una acción explícita de la UI. Para autorizar un guardado, valida la instantánea que se enviará mediante el plan.
Ejemplo completo
csharp
using Greencore.platform.validators;
var plan = Validation.For<LoginDraft>()
.Field(x => x.Email, field => field.Sequence(sequence => sequence
.Required("El correo es obligatorio.")
.Email("El correo no tiene un formato válido.")))
.Build();
using var session = plan.CreateSession(TimeSpan.FromMilliseconds(250));
session.Changed += snapshot =>
{
Console.WriteLine($"Versión {snapshot.Version}: {snapshot.State}");
if (snapshot.Report is not { } report) return;
foreach (var error in report.ForField(
(LoginDraft x) => x.Email,
DiagnosticView.Summary))
{
Console.WriteLine(error.Message);
}
};
var first = session.UpdateWithResultAsync(new LoginDraft("incorrecto"));
var second = session.UpdateWithResultAsync(new LoginDraft("valid@example.com"));
var firstResult = await first;
var secondResult = await second;
Console.WriteLine($"Primera vigente al terminar: {firstResult.IsCurrentAtCompletion}");
Console.WriteLine($"Segunda: {secondResult.State}");
var immediate = await session.EvaluateAsync(new LoginDraft(""));
if (immediate.State == FormValidationState.Invalid)
Console.WriteLine(immediate.Report!.ForField("Email", DiagnosticView.Summary)[0].Message);
// La autorización final utiliza exactamente la instantánea que se guardará.
var submitted = new LoginDraft("valid@example.com");
var finalReport = await plan.ValidateAsync(submitted);
if (finalReport.IsValid)
Console.WriteLine("Puede enviarse.");
public sealed record LoginDraft(string? Email);Estado de una operación
| Estado | Reporte | Error | Significado |
|---|---|---|---|
Valid | Presente y válido | null | La evaluación terminó sin incumplimientos |
Invalid | Presente e inválido | null | Hay diagnósticos funcionales |
Failed | null | Presente | Ocurrió un fallo técnico |
Canceled | null | null | La operación fue cancelada |
Terminar el await no garantiza que un dispatcher de UI haya aplicado el evento. Usa Changed para actualizar controles. IsCurrentAtCompletion describe el instante de terminación; otra edición puede comenzar inmediatamente después.