1

我有一个带有 EF 核心数据上下文的 MVC 核心项目。我使用脚手架来创建 CRUD。我只想知道当用户点击保存时,是否有使用我的自定义逻辑来解析文本框中的日期时间?

目前我在创建页面中有这个:

<div class="form-group col-md-6 col-xs-12">
    <label asp-for="Lead.BDayDateTime" class="control-label"></label>
    <input asp-for="Lead.BDayDateTime" class="form-control" />
    <span asp-validation-for="Lead.BDayDateTime" class="text-danger"></span>
</div>

及其在我的模型中的定义:

[Required(ErrorMessage = "Please enter year of birth or birthday (ex. 1363, 1984, 1984-09-23, 1363-07-01)")]
[Display(Name = "Birthday", Prompt = "Birth Year or Birthday", Description = "Please enter year of birth or birthday (ex. 1363, 1984, 1984-09-23, 1363-07-01)")]
[DisplayFormat(NullDisplayText = "Not Entered", DataFormatString = "{0:yyyy}", ApplyFormatInEditMode = true)]
public DateTime BDayDateTime { get; set; }

我想手动解析日期时间,因此用户可以输入非公历日期时间值(我将在保存到数据库之前将它们转换为公历)。

4

2 回答 2

0

我找到了一个解决方案,可以使用以下方法将我的自定义日期字符串解析为 DateTime TypeConverter

我创建了一个自定义 TypeConverter:

public class JalaliAwareDateConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context,
        Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string s)
        {
            return s.ParseDateString(); // My custom parser
        }

        return base.ConvertFrom(context, culture, value);
    }
}

并在其中注册Startup.cs(根据我的经验,感谢这个答案和@zdeněk 评论,TypeConverter 属性在 asp.net 核心中不起作用):

TypeDescriptor.AddAttributes(typeof(DateTime), new TypeConverterAttribute(typeof(JalaliAwareDateConverter)));

现在,我在 DateTime 属性中有有效值,但验证仍然失败。这个问题是因为正则表达式验证器试图验证 DateTime 对象!删除了正则表达式验证器,瞧,它可以工作了!

于 2018-10-16T18:51:16.750 回答
-1

如果要定义自定义验证逻辑,则需要创建一个派生自的自定义类ValidationAttribute

示例代码:

using System.ComponentModel.DataAnnotations;

namespace StatisticsWeb.Models
{
    public class PatientFormBirthdayValidation : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var patient = (Patient)validationContext.ObjectInstance;
            if (patient.BirthDate == null)
            {
                return new ValidationResult("Date of Birth field is required");
            }
            else if ((patient.BirthDate >= DateTime.Now) || (patient.BirthDate < DateTime.MinValue))
            {
                return new ValidationResult("Date of Birth is invalid");
            }
            else
            {
                return ValidationResult.Success;
            }
        }
    }
}

并用这个属性装饰你的模型:

[PatientFormBirthdayValidation]
public DateTime BDayDateTime { get; set; }

当然你可以使用其他属性,比如[Display(Name = "Date of Birth")][Required]

于 2018-10-11T06:46:45.070 回答