gpt4 book ai didi

c# - ASP.NET Core 中枚举的自定义验证器

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

public enum GroupBy
{
status = 0,
dueDate = 1,
requester = 2,
assignee = 3
}

我在 web api 的参数中使用这个枚举是这样的:-

public async Task<IActionResult> Dashboard(GroupBy groupBy)

我的问题是当我传递正确的枚举时它会给出输出。但是如果我传递任何无效的枚举,它会抛出错误,这是 ASP.NET Core 的内置错误。我试图实现,但在调用此 api 时,它不会进入我的自定义验证器。当我传递有效枚举时,它将进入我的验证器。

所以,我想为它实现自定义验证。有人请帮忙

最佳答案

当值不正确时,模型绑定(bind)器无法创建 GroupBy 实例,也无法对此实例调用自定义验证。

一个解决方案是将输入参数类型更改为字符串并手动执行检查和解析步骤:

public async Task<IActionResult> Dashboard(string groupBy)
{
if(!Enum.TryParse(groupBy, out GroupBy by))
{
ModelState.AddModelError(nameof(groupBy), $"The value is invalid. Valid value : {Enum.GetValues(typeof(GroupBy))}");
return BadRequest(ModelState);
}
return Ok(by);
}

其他解决方案是覆盖 the model binder behavior .为此,您需要创建一个自定义 Binder :

public class GroupByBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}

// Try to fetch the value of the argument by name
var modelName = "groupBy";
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);

if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}

bindingContext.ModelState.SetModelValue(modelName, valueProviderResult);

var value = valueProviderResult.FirstValue;

// Check if the argument value is null or empty
if (string.IsNullOrEmpty(value))
{
return Task.CompletedTask;
}

// Custom validation
if (!Enum.TryParse(value, out GroupBy groupBy))
{
bindingContext.ModelState.AddModelError(modelName, $"The value is invalid. Valid value : {Enum.GetValues(typeof(GroupBy))}");
return Task.CompletedTask;
}

bindingContext.Result = ModelBindingResult.Success(groupBy);
return Task.CompletedTask;
}
}

现在您可以:

public async Task<IActionResult> Dashboard2([ModelBinder(typeof(GroupByBinder))] GroupBy groupBy)
{
if(!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok(groupBy);
}

您可以将此行为覆盖到所有 GroupBy 输入参数:

public class GroupByBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}

if (context.Metadata.ModelType == typeof(GroupBy))
{
return new BinderTypeModelBinder(typeof(GroupByBinder));
}

return null;
}
}

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelBinderProviders.Insert(0, new GroupByBinderProvider());
});
}
}

警告:当数据来自 JSON 或 XML 内容时,不使用模型构建器。有关 the official documentation 的更多详细信息.

关于c# - ASP.NET Core 中枚举的自定义验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66329452/

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