asp.net - ASP.NET Core 自定义模型绑定失败时的错误
问题描述
每当将空值或无效值发送到 ASP.NET Core Web API 端点时,我都会尝试应用后端验证,但我不知道如何处理模型绑定失败错误。
ModelState
提交无效值时可能会出现此错误:totalPrice: ["Could not convert string to decimal: . Path 'totalPrice', line 1, position 71."]
0: "Could not convert string to decimal: . Path 'totalPrice', line 1, position 71."
看起来模型绑定失败并且错误直接显示给客户端。
我有一个用ApiController
属性装饰的非常简单的控制器。
[ApiController]
public class ProductsController
{
[HttpPost]
public IActionResult Post([FromBody]CreateProductDto model)
{
model.Id = await service.CreateProduct(model);
return CreatedAtRoute(
routeName: "GetProduct",
routeValues: new { id = model.Id },
value: model
);
}
}
和我的 DTO 模型
public class CreateProductDto
{
[Required(ErrorMessage = "Invalid value")]
public decimal totalPrice { get; set;}
public int count { get; set; }
}
有没有办法从模型绑定错误中自定义文本?我想阻止发送敏感信息并向客户提供友好的反馈?
解决方案
您可以从 ConfigureServices 方法中的 Startup 类自定义错误消息。您可以查看详细信息Microsoft 文档。
这是一个例子 -
services.AddMvc(options =>
{
var iStrFactory = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
var L = iStrFactory.Create("ModelBindingMessages", "WebUI"); // Resource file location
options.ModelBindingMessageProvider.SetValueIsInvalidAccessor((x) => L["The value '{0}' is invalid."]);
options.ModelBindingMessageProvider.SetValueMustBeANumberAccessor((x) => L["The field {0} must be a number."]);
options.ModelBindingMessageProvider.SetMissingBindRequiredValueAccessor((x) => L["A value for the '{0}' property was not provided.", x]);
options.ModelBindingMessageProvider.SetAttemptedValueIsInvalidAccessor((x, y) => L["The value '{0}' is not valid for {1}.", x, y]);
options.ModelBindingMessageProvider.SetMissingKeyOrValueAccessor(() => L["A value is required."]);
options.ModelBindingMessageProvider.SetUnknownValueIsInvalidAccessor((x) => L["The supplied value is invalid for {0}.", x]);
options.ModelBindingMessageProvider.SetValueMustBeANumberAccessor((x) => L["Null value is invalid.", x]);
});
你可以阅读这个博客。
推荐阅读
- django - 如何使用单独的应用程序文件夹运行本地 Django 站点?
- android - 启动完成不工作
- python - 制作python的编译条文档字符串但不断言
- javascript - 使用 jQuery 合并两个包含数组的 JSON 对象
- sql - SQL - 用一些不同和一些相同的列连接两个表
- java - 使用数据提供程序时如何在测试后重新启动浏览器
- android - 使用媒体控制器从 Firebase 流式传输视频
- kotlin - Kotlin 中的“何时重复”是什么?
- selenoid - 在 selenoid 中使用 Chrome/FF 测试版
- angularjs - 错误:[ng:areq] 参数 'fn' 不是函数,得到字符串