C# FluentValidation能否识别调用了哪些方法(PUT或POST)?

C# FluentValidation能否识别调用了哪些方法(PUT或POST)?,c#,asp.net-core,.net-core,asp.net-core-webapi,fluentvalidation,C#,Asp.net Core,.net Core,Asp.net Core Webapi,Fluentvalidation,在ASP.NETCore3.0WebAPI中,我对Post和Put方法使用相同的DTO。在创建新的项目时我想防止已经存在的名称。像这样: public ItemValidator(IItemRepository itemRepository) { RuleFor(input => input.Name).NotEmpty(); RuleFor(input => input.Name).Must(name => !itemRepos

ASP.NETCore3.0WebAPI
中,我对
Post
Put
方法使用相同的DTO。在创建新的
项目时
我想防止已经存在的名称。像这样:

    public ItemValidator(IItemRepository itemRepository)
    {
        RuleFor(input => input.Name).NotEmpty();
        RuleFor(input => input.Name).Must(name => !itemRepository.ItemExists(name))
            .WithMessage(input => $"Item '{input.Name}' already exists");
    }
这一切对于更新和插入都非常有用。无法将名称更新为已存在的名称。但是当您尝试将“ItemA”更改为“ItemA”(新名称与旧名称相同)时,您会遇到该错误,这可能会有点误导(尽管技术上是正确的)

在dto本身中,我没有项目的唯一
id
。因为我在路径中传递
id


如果我有权访问已调用的控制器的方法及其参数(包括
id
),我将能够判断是否有人试图将项的名称更改为相同的名称。

FluentValidation可以识别调用的HTTP方法。为此,您需要在启动文件的ConfigureServices方法中添加HttpContextAccessor

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddHttpContextAccessor();
        services.AddMvc(setup => { }).AddFluentValidation();
        services.AddTransient<IValidator<MyModel>, MyModelValidator>();
    }
编辑:


如果损坏了问题,请考虑标记这个答案。< /P>你可以在代码中添加代码吗?中间件根据请求调用FluentValidation。您只需在配置中添加它,如下所示:
.AddFluentValidation(fv=>fv.RegisterValidatorsFromAssemblyContaining())您可以从request route@AdamWojnar获得它
public class MyModelValidator : AbstractValidator<MyModel>
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public MyModelValidator(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;

        RuleFor(myModel => myModel.Id)
            .NotEmpty();

        RuleFor(myModel => myModel.Value)
            .Must(value => MyRule(value, _httpContextAccessor.HttpContext.Request.Method));
    }

    private bool MyRule(string value, string method)
    {
        if (method.ToUpper() == "POST")
        {
            return true;
        }
        else if (method.ToUpper() == "PUT")
        {
            // validatation logic for value
            return !string.IsNullOrWhiteSpace(value);
        }
        return false;
    }
}
var path = _httpContextAccessor.HttpContext.Request.Path.Value;