数据注释使类的属性成为必需的和可选的,具体取决于控制器
本文关键字:取决于 控制器 注释 属性 数据 | 更新日期: 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."]}
。