gpt4 book ai didi

c# - aspnet 5 RESTful api ModelState.IsValid == true 即使值根据 DataAnnotations 无效

转载 作者:行者123 更新时间:2023-11-30 18:20:40 25 4
gpt4 key购买 nike

我已经使用 fiddler 和 swagger 尝试测试并获得相同的结果。

这是模型:

using System.ComponentModel.DataAnnotations;
namespace AdGeo.Configuration.WebApi.Model
{
public class ValueAdd
{
public string test { get; set; }
[Required(ErrorMessage = "Range is required")]
[Range(0,9,ErrorMessage ="Range 0 to 9")]
[Display(Name ="Test Required")]
public int? testrequired { get; set; }
}
}

这是 Controller :

using Microsoft.AspNet.Mvc;
using AdGeo.Configuration.WebApi.Model;

// For more information on enabling Web API for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860

namespace AdGeo.Configuration.WebApi.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}

// POST api/values
[HttpPost]
public IActionResult Post([FromBody]ValueAdd valueAdd)
{
if(ModelState.IsValid)
{
return new CreatedAtActionResult("Get", "Values", new { id = 5 }, valueAdd);
}
return new BadRequestObjectResult(ModelState);
}
}
}

示例 Json:

{
"test": "string",
"testrequired": 100
}

它到达等于 true 的 ModelState.IsValid,我希望它等于 false,因为 100 超出了范围。

此外,如果我尝试发布此 Json:示例 Json:

{
"test": "string"
}

我希望 ModelState.IsValid 为假,但它等于真。

我一直在搜索和搜索无济于事,我看到的最接近的是人们试图创建一个 Action 过滤器,但这些大多是针对 prev MVC6 的解决方案,而不是相同的。

我错过了什么,请注意这是我在 StackExchange 上的第一篇文章,对于任何格式问题,我们深表歉意。请让我知道需要澄清的内容,我会相应地进行编辑。

谢谢!

最佳答案

同样在这里,我认为这是因为我使用的是 AddMvcCore 而不是 AddMvc。为了解决这个问题,我创建了以下操作过滤器属性。它将检查模型是否为 null 且是必需的,并在不为 null 时运行验证。

/// <summary>
/// Validate inputs and update ModelState with errors
/// </summary>
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var parameters = context.ActionDescriptor.Parameters.Cast<ControllerParameterDescriptor>().ToDictionary(p => p.Name);

foreach (var kvp in context.ActionArguments)
{
if (kvp.Value == null)
{
if (!parameters[kvp.Key].ParameterInfo.IsOptional)
{
context.ModelState.AddModelError($"{kvp.Key}", "Parameter is required");
}

continue;
}

var results = new List<ValidationResult>();
var vc = new ValidationContext(kvp.Value);
if (!Validator.TryValidateObject(kvp.Value, vc, results))
{
var errs = from vr in results
from member in vr.MemberNames
select new { Member = member, vr.ErrorMessage };

foreach (var err in errs)
{
context.ModelState.AddModelError($"{kvp.Key}.{err.Member}", err.ErrorMessage);
}
}
}
}
}

关于c# - aspnet 5 RESTful api ModelState.IsValid == true 即使值根据 DataAnnotations 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055769/

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