Он отлично работает в POST (создать) конечную точку. Однако возникает проблема с конечной точкой PUT (обновление).
Поскольку в методе PUT мы хотим получить одну дату из базы данных, используя {id , который находится в конечной точке PUT.
Код: Выделить всё
public class Contract
{
[JsonPropertyName("StartDate")]
public DateTime StartDate { get; set; }
[DateGreaterThan("StartDate", ErrorMessage="EndDate must be greate than start date.")]
[JsonPropertyName("EndDate")]
public DateTime EndDate { get; set; }
}
internal class DateGreaterThanAttribute : ValidationAttribute
{
private readonly string _comparisonProperty;
public DateGreaterThanAttribute(string comparisonProperty)
{
_comparisonProperty = comparisonProperty;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// get your StartDate and EndDate from model and value
DateTime StartDate = (DateTime)value;
var property = validationContext.ObjectType.GetProperty(_comparisonProperty);
if (property == null)
{
throw new ArgumentException("Comparison property with this name not found");
}
var comparisonValue = property.GetValue(validationContext.ObjectInstance);
// perform comparison
// This works in POST
if (StartDate < (DateTime)comparisonValue)
{
return new ValidationResult("start date must be less than the end date");
}
else
{
return ValidationResult.Success;
}
// Now in case of PUT, I want to get StartDate from
// the database querying the record using "id"
// (1234 in below example) from Route of endpoint
// https://localhost:5001/mycontroller/1234
}
}
Мы не можем выполнить эту проверку в контроллере в соответствии с требованиями от бизнеса. Это должна быть проверка на основе модели.
Подробнее здесь: https://stackoverflow.com/questions/787 ... re-web-api
Мобильная версия