Skip to content

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 vigente

UpdateWithResultAsync 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 ​

EstadoReporteErrorSignificado
ValidPresente y válidonullLa evaluación terminó sin incumplimientos
InvalidPresente e inválidonullHay diagnósticos funcionales
FailednullPresenteOcurrió un fallo técnico
CancelednullnullLa 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.

Uso personal limitado. Uso comercial sujeto a autorización escrita.