【发布时间】:2020-11-04 00:08:32
【问题描述】:
我创建了一个模型和一个自定义验证属性,以确保该值大于零。我遇到的问题是自定义属性的构造函数被命中,但 IsValid 覆盖从未被命中。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class GreaterThanZeroAttribute : ValidationAttribute
{
/// <summary>
/// Ensures that the value is greater than zero.
/// </summary>
public GreaterThanZeroAttribute()
: base("The value {0} must be greater than 0.")
{
}
public override bool IsValid(object value)
{
bool isValueLong = long.TryParse(value?.ToString(), out long longValue);
if (isValueLong && longValue > 0)
return true;
else
return false;
}
}
public class ApplicationModel
{
[Required]
public string Name { get; set; }
[GreaterThanZero]
public IEnumerable<string> AssignedUserGroupIDs { get; set; }
}
现在,客户端将在 JSON 中设置 AssignedUserGroupIDs。我想验证该集合中的每个 ID 是否大于零。
这是请求的示例 JSON:
{
"name": "Test Application",
"assignedUserGroupIDs": [ "1", "-1001" ]
}
对于它的价值,我使用 JsonOptions 来使用驼峰式大小写作为属性名称并将字符串转换为枚举。我之所以提到这一点,是因为我不确定 Json 是否会导致任何问题。
public static IServiceCollection AddWebApiServices(this IServiceCollection services)
{
_ = services ?? throw new ArgumentNullException(nameof(services));
Setup.AddServices(services);
services.AddMvcCore(ConfigureDefaults)
.AddJsonFormatters()
.AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.SerializerSettings.Converters.Add(new StringEnumConverter());
})
.AddCors("*")
.AddControllers();
return services;
}
这里是控制器:
[HttpPost]
[Route("applications")]
[EnableCors(PolicyName = CorsPolicies.Default)]
public IActionResult CreateApplication([FromBody] ApplicationModel postModel)
{
List<long> assignedUserGroups = new List<long>();
foreach (string stringUserGroupID in postModel.AssignedUserGroupIDs)
{
assignedUserGroups.Add(Convert.ToInt64(stringUserGroupID));
}
// business logic here...
return new JsonResult(applicationID);
}
【问题讨论】:
标签: c# json asp.net-mvc asp.net-web-api model-view-controller