控制流从模型返回而没有进入控制器动作

时间:2018-08-30 15:08:24

标签: c# asp.net-core .net-core asp.net-core-webapi

我有一个.NET Core项目。我正在使用视图模型来绑定来自请求的传入数据。

在视图模型中,我正在进行数据注释[Required]验证。如果该特定字段的数据为空,则执行从那里返回而不传递给控制器​​。

我需要执行转到控制器,以使用我的自定义消息以及模型状态错误来修改响应。

我的模特看起来像

[Required(ErrorMessage = ErrorConstants.required)]
[StringLength(5, MinimumLength = 5, ErrorMessage = ErrorConstants.invalid)]
[RegularExpression("^[0-9]+$", ErrorMessage = ErrorConstants.incorrectInputFormat)]
public string ZipCode { get; set; }

我的控制器操作方法示例。请指导。

if (viewModel == null)
{
    _dictionary = _apiResponseService.SetResponse("false", ErrorConstants.nullOrIncorrect);
    return Ok(_dictionary);
}
if(!ModelState.IsValid)
{
    return Ok(_apiResponseService.SetResponse("false", ErrorConstants.invalidJson, ModelState.ToDictionary(kvp => kvp.Key.Replace("viewModel.", ""),
      kvp => kvp.Value.Errors.Select(error =>
      {
          if (error.Exception == null)
          {
              return error.ErrorMessage;
          }
          else
          {
              return string.Format(ErrorConstants.required, kvp.Key.Split('.').Last());
          }
      }).FirstOrDefault())));
}

2 个答案:

答案 0 :(得分:0)

我已经找到解决方法。在控制器中,注释掉[ApiController]属性,即可完成工作。

答案 1 :(得分:0)

新的[ApiController]属性具有的功能

  

验证错误会自动触发HTTP 400响应。

最有可能模型状态无效。这就是为什么它没有发挥作用的原因。

  

当   SuppressModelStateInvalidFilter属性设置为true。添加   之后的 Startup.ConfigureServices 中的以下代码   services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressConsumesConstraintForFormFileParameters = true;
    options.SuppressInferBindingSourcesForParameters = true;
    options.SuppressModelStateInvalidFilter = true; //<-- THIS HERE
});

因此,不必完全删除[ApiController]属性,而应保留它并禁用该默认行为,以便控制器可以保留其提供的所有优点,并且仍然可以在操作中检查模型状态。

引用Build web APIs with ASP.NET Core