数据注释使类的属性成为必需的和可选的,具体取决于控制器

本文关键字:取决于 控制器 注释 属性 数据 | 更新日期: 2023-09-27 17:56:43

class RequiredOptionalId
{
    public int Id { get; set; }
}

我有类 RequiredOptionalId 的这个属性,它是一个模型。我从两个控制器访问它。

class RequiredIdController : ApiController
    {
    public IHttpActionResult Post([FromBody]RequiredOptionalId requiredOptionalId)
    {
                    if (!ModelState.IsValid)
                    {
                        return BadRequest();
                    }
    }
    }
    class OptionalIdController : ApiController
    {
    public IHttpActionResult Post([FromBody]RequiredOptionalId requiredOptionalId)
    {
                    if (!ModelState.IsValid)
                    {
                        return BadRequest();
                    }
    }
    }

我想使用数据注释。但是当我申请时——

class RequiredOptionalId
    {
        [Required,Range(1, int.MaxValue)]
        public int Id { get; set; }
    }

这会产生"可选 IdController"的 post 方法问题,因为字段是必需的,而对于此控制器来说并非如此。

如果我删除此声明,即

 class RequiredOptionalId
        {
            public int Id { get; set; }
        }

这会产生"RequiredIdController"的问题,因为没有对Id字段的验证。

我可以在"RequiredIdController"post方法的控制器中添加它,但我不想这样做。

还有其他方法可以使用这些注释或某些过滤器来实现此目的吗?

数据注释使类的属性成为必需的和可选的,具体取决于控制器

您可以编写 ActionFilter 并传递所需的参数。使用 .Net Core 的示例。

您的操作:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    [RequiredParameters("category","name")]
    public IActionResult Get(Request request)
    {
        if(ModelState.IsValid)
            return Json(request);
        return BadRequest(ModelState);
    }
}

您的属性:

public class RequiredParametersAttribute : ActionFilterAttribute
{
    private string[] requiredProperties;
    public RequiredParametersAttribute(params string[] props)
    {
        requiredProperties = props;
    }
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        foreach (var property in requiredProperties)
        {
            //NOTE: assumption that action has only one parameter and looking only at first children in the object tree
            object obj = context.ActionArguments.FirstOrDefault().Value;
            if (obj?.GetType().GetProperty(property).GetValue(obj) == null || obj.GetType().GetProperty(property).GetValue(obj).Equals(GetDefaultValue(obj.GetType().GetProperty(property).PropertyType)))
                context.ModelState.TryAddModelError(property, property +" is required.");
        }
    }
    public static object GetDefaultValue(Type type)
    {
        return type.GetTypeInfo().IsPrimitive ? Activator.CreateInstance(type) : null;
    }
}

您的请求类:

public class Request
{
    public int category { get; set; }
    public string name { get; set; }
}

要求:/api/values?name=test将返回{"category":["category is required."]}