c# - MVC 表单验证 | 自定义“验证属性”未收到正确的“值”
问题描述
上下文
我有一个包含两个日期选择器的 MVC 表单,我为此编写了一个自定义验证属性,以确保两个选定的日期都不是过去的(>= 今天)。
问题
验证属性仅适用于第一个日期,但不适用于第二个日期,因为在验证属性中传递给“值”对象的值始终重置为表单类 ( HomeForm.cs ) 构造函数 ( HomeForm( )中设置的值)。
- 示例(VS + 浏览器屏幕截图):选择的日期是 10/08/2021,但dateB 的对象值是 16/08/2021。
编码
这是我的表格(HomeForm.cs):
public class HomeForm
{
public HomeForm()
{
dateA = DateTime.Now.Date;
TimeSpan time = new TimeSpan(1, 0, 0, 0);
dateB = DateTime.Now.Date + time;
}
[Required(ErrorMessage = "You must select a departure date.")]
[DataType(DataType.Date)]
[DisplayName("Departure date:")]
[DateTimeRange]
public DateTime dateA { get; set; }
[Required(ErrorMessage = "You must select a return date.")]
[DataType(DataType.Date)]
[DisplayName("Return date:")]
[DateTimeRange]
public DateTime dateB { get; set; }
};
自定义验证属性“DateTimeRange”应用于dateA和dateB:
[AttributeUsage(AttributeTargets.Property)]
public class DateTimeRangeAttribute : ValidationAttribute
{
private readonly DateTime _today;
public DateTimeRangeAttribute()
{
_today = DateTime.Now.Date;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value is not DateTime)
return new ValidationResult("Date format is not valid.");
if (!IsValid((DateTime)value))
return new ValidationResult("Chosen date is in the past.");
if(value.ToString().Count() != 19)
return new ValidationResult("Not a valid date. Choose a different one.");
return ValidationResult.Success;
}
private bool IsValid(DateTime value)
{
value = value.Date;
return value >= _today;
}
}
解决方案
推荐阅读
- java - JPA 存储库方法相同或不同
- drools - 在 Drool 7.5 中加载多个规则文件
- ckeditor4.x - 使用第三方 API 修改 HTML
- string - 如何在 Cordova 中读取 String.xml
- async-await - 当我从邮递员发送帖子请求时,出现此错误
- c# - 2sxc 自定义 API 返回实体列表
- azure-active-directory - 如何仅授予部署到特定插槽的权限?
- r - 在 R 中使用 Group by 或 Aggregate 进行数据框分组
- javascript - 在 node.js 中处理 20000 数组时出错
- matlab - 深复制浅复制 Matlab 结构/结构字段