gpt4 book ai didi

c# - 开始和结束日期的数据注释

转载 作者:行者123 更新时间:2023-11-30 15:37:51 24 4
gpt4 key购买 nike

我对开始和结束日期使用 View 模型,并使用数据注释进行验证。验证规则是:

  1. 开始日期不应大于结束日期且不能为空、空白
  2. 结束日期不得早于开始日期且不得早于DateTime.Now 且不为空,空白

以下 View 模型由开始日期和结束日期属性组成。令人困惑的是,如何在下面的代码中传递 EndDate 数据注释中的 EndDate 值和 EndDate 数据注释中的 StartDate 值:

  public class StartEndDate
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[StartEndDateRange("2000/01/01", "value of end date properties")]
public DateTime StartDate { get; set; }

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[StartEndDateRange("value of startdate properties", DateTime.Now.ToString("yyyy/MM/dd"))]
public DateTime EndDate { get; set; }


}

public class StartEndDateRangeAttribute : ValidationAttribute
{
private const string DateFormat = "yyyy/MM/dd";
private const string DefaultErrorMessage =
"'{0}' must be a date between {1:d} and {2:d}.";

public DateTime MinDate { get; set; }
public DateTime MaxDate { get; set; }

public StartEndDateRangeAttribute(string minDate, string maxDate)
: base(DefaultErrorMessage)
{
MinDate = ParseDate(minDate);
MaxDate = ParseDate(maxDate);
}

public override bool IsValid(object value)
{
if (value == null || !(value is DateTime))
{
return true;
}
DateTime dateValue = (DateTime)value;
return MinDate <= dateValue && dateValue <= MaxDate;
}
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentCulture,
ErrorMessageString,
name, MinDate, MaxDate);
}

private static DateTime ParseDate(string dateValue)
{
return DateTime.ParseExact(dateValue, DateFormat,
CultureInfo.InvariantCulture);
}
}

最佳答案

创建两个不同的验证属性。一个 DateBefore 和另一个 DataAfter

您可以从validationContext 获取正在验证的模型的属性。

DateBefore中做

protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
PropertyInfo endDateProperty= validationContext.ObjectType.GetProperty("EndDate");
...
}

获取值

var endDate = endDateProperty.GetValue(validationContext.ObjectInstance, null);

现在比较 valueendDate

编辑

多一点代码

public class BeforeEndDateAttribute : ValidationAttribute{
public string EndDatePropertyName { get; set; }
public string StartDate { get; set; }


protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
PropertyInfo endDateProperty = validationContext.ObjectType.GetProperty(EndDatePropertyName);

DateTime endDate = (DateTime) endDateProperty.GetValue(validationContext.ObjectInstance, null);

var startDate = DateTime.Parse(StartDate);

// Do comparison
// return ValidationResult.Success; // if success
return new ValidationResult("Error"); // if fail
}

}

然后像这样使用:

public class MyModel
{
[BeforeEndDate(EndDatePropertyName = "EndDate", StartDate = "2000/01/01")]
public DateTime StartDate { get; set; }

// [AfterStartDate(StartDatePropertyName = "StartDate", EndDate = "2020/01/01")]
public DateTime EndDate { get; set; }
}

关于c# - 开始和结束日期的数据注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139979/

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