gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:41:20 25 4
gpt4 key购买 nike

ASP.NET Core 3.0 Web API 中,我对 PostPut 使用相同的 DTO> 方法。在创建新的 Item 时,我想防止已经存在的名称。像这样:

    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

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

最佳答案

FluentValidation 可以识别调用了哪个 HTTP 方法。为此,您需要在 StartUp 文件的 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>();
}

现在您可以在验证器类中使用 IHttpContextAccessor。这是我的验证器类

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;
}
}

您可以从 _httpContextAccessor 获取请求路径,如下所示

var path = _httpContextAccessor.HttpContext.Request.Path.Value;

编辑:

如果这能解决您的问题,请考虑将此答案标记为已接受。

关于c# - FluentValidation 能否识别调用了哪些方法(PUT 或 POST)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59203733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com