c# - 根据服务方法/Web API 请求验证 Blazor 中的字段

标签 c# asp.net-core blazor

各位程序员大家好! :)

我最近一直在玩 Blazor(服务器端)并遇到了一些问题。我正在尝试根据服务方法验证字段,该服务方法是返回 true/false 的简单 HTTP 请求。考虑使用/免费用户名样式检查。问题是,在 Blazor 中推荐的制作方法是什么。基本上,我想到了两种解决方案。

  1. 在具有 EditForm 的组件中初始化自己的EditContextValidationMessageStore然后将 OnChange 绑定(bind)到自定义方法,该方法将执行正确的验证方法并在出现问题时添加验证消息。

  2. 与之前的解决方案类似,但不是使用 EditForm 将其放在组件(或页面)内。 ,只需使用 CascadingParameter 创建一个自定义组件与 EditContext并让所有的魔法都发生在那里。

或者第三个,一个更简单的版本,我不知道。 :)

最佳答案

如果您想使用 FluentValidation,请添加对 PeterLeslieMorris.Blazor.FluentValidation 的包引用

在客户端启动中初始化它

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddFormValidation(config =>
        {
            config
                .AddDataAnnotationsValidation()
                .AddFluentValidation(typeof(Startup).Assembly);
        });
    }

您要验证的类(class):

public class Person
{
    [Required]
    public string Name { get; set; }
    public string EmailAddress { get; set; }
}

创建流畅的验证器:

public class PersonValidator : AbstractValidator<Person>
{
    private readonly HttpClient HttpClient;

    public PersonValidator(HttpClient httpClient)
    {
        HttpClient = httpClient;
        RuleFor(x => x.EmailAddress)
            .MustAsync(BeAvailable)
            .WithMessage("Email address is not available");
    }

    private Task<bool> BeAvailable(
        Person person,
        string emailAddress,
        PropertyValidatorContext context,
        CancellationToken cancellationToken)
    {
        return HttpClient.PostJsonAsync<bool>("/Person/IsEmailAddressAvailable", new { EmailAddress = emailAddress });
    }
}

编辑 View 模型的页面:

@page "/"
@using ViewModels;

    <EditForm Model=Person>
        <PeterLeslieMorris.Blazor.Validation.Validate />
        Name <InputText @bind-Value=Person.Name /><br />
        <ValidationMessage For=@(() => Person.Name) /><br />
        <br/>
        Email <InputText @bind-Value=Person.EmailAddress /><br />
        <ValidationMessage For=@(() => Person.EmailAddress) /><br />
        <br/>
        <input type="submit" value="Submit"/>
    </EditForm>


@code {
    Person Person = new Person();
}

最后是服务器端。我们需要一个具有 EmailAddress 属性的复杂对象来满足 ASP MVC 参数标准。

using Microsoft.AspNetCore.Mvc;

namespace BlazorApp13.Server.Controllers
{
    public class PersonController : Controller
    {
        [HttpPost]
        public bool IsEmailAddressAvailable([FromBody]RequestWithEmailAddress request)
        {
            bool available = (request.EmailAddress ?? "").ToLowerInvariant().IndexOf("available.com") > -1;
            return available;
        }
    }

    public class RequestWithEmailAddress
    {
        public string EmailAddress { get; set; }
    }
}

*已知错误:Blazor 不正式支持异步验证 - 因此即使验证消息会出现/消失,InputText 组件的 CSS 状态也不会在有效/无效之间变化。因此,您可能想使用 CSS 规则隐藏此组件的红色/绿色视觉效果。

关于c# - 根据服务方法/Web API 请求验证 Blazor 中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57643479/

相关文章:

templates - Visual Studio 2017 ASP NET Core 2 脚手架模板

c# - 验证 Blazor 中的 URL 参数并使用 404 响应

azure - Blazor Web 程序集网站无法在 Azure Static WebApp 中运行

c# - 在 C# 中使用 Regex 比较两个不同的文件夹

c# - 我应该在 Page_Init 中以编程方式添加控制事件处理程序吗?

c# - 如何在 Identity ASP.NET Core 2.1(Identity Scaffolded)中播种用户角色

c# - 如何在 Blazor 服务器中动态添加、删除输入文本框和获取值?

c# - 使用 CreateFileAsync 创建的文件在哪里?

c# - 如何重写 WPF DataGrid 行为以实现对外部应用程序的拖放操作?

ASP.NET 核心 : asp-* attributes use request payload over model?