gpt4 book ai didi

c# - 如何指示 TypeConverter 中的错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:26 25 4
gpt4 key购买 nike

我正在尝试做一些 model binding on simple types with TypeConverter在 ASP.NET Core 2 中,即将 string 转换为我的自定义类型。

如果字符串格式错误,我想指出,例如通过抛出异常:

public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string s)
{
var result = Parse(s);

if (!result.Success)
{
throw new ArgumentException("Invalid format", nameof(value), result.Exception);
}

return result.Value;

}

return base.ConvertFrom(context, culture, value);
}

目前看来异常只是被吞没并被忽略,将绑定(bind)值保留为默认值。端点的调用者永远不会被告知该值是错误的,我在 Controller 中的代码也不知道该值最初是无效的(默认值很容易成为有效值)。

如果格式无效,我希望转换失败,但我该怎么做?

最佳答案

The caller of the endpoint is never told that the value is wrong, nor does my code in the controller know that the value was originally invalid (the default value could easily be a valid value).

所有模型绑定(bind)错误都通过 Controller 操作中可访问的 ControllerBase.ModelState 属性进行通信。 ModelStateIsValid 属性设置为 false 如果在模型期间发生某些错误 bindingvalidation .

这是一种有意的关注点分离。与随心所欲的异常冒泡相比,这种方式有以下优点:

  • 所有操作参数的所有绑定(bind)和验证错误都将在 ModelState 中一起提供。使用异常方法时,只会传达第一次遇到的错误。
  • 异常会中断请求管道的执行。使用 ModelState,您可以在后续管道阶段采取适当的操作,并决定是否仍然可以处理遇到错误的请求。
  • ModelState 方法在错误处理方面更加灵活。您可以返回适当的响应(例如 400 Bad Request 或返回带有详细错误描述的 HTML View )。

处理无效模型状态的最基本方法是通过检查 ModelState.IsValid 值的瘦操作过滤器:

public class CheckModelStateAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
context.Result = new BadRequestObjectResult(context.ModelState);
}
}
}

Startup.ConfigureServices() 中注册过滤器:

services.AddMvc(options =>
{
options.Filters.Add(new CheckModelStateAttribute());
});

在模型绑定(bind)错误的情况下,HTTP错误代码400 Bad Request将返回给调用者, Controller Action 将不会被调用。

Sample Project on GitHub

关于c# - 如何指示 TypeConverter 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49696060/

25 4 0
文章推荐: c# - 方法重载中的 Expression> 与 Func
文章推荐: css - 如何在
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com