MVC Core и EF Core вручную анализируют дату и время в текстовом поле ввода - PullRequest
0 голосов
/ 11 октября 2018

У меня есть основной проект MVC с контекстом основных данных EF.Я использовал леса для создания 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; }

Я хочу вручную проанализировать дату и время, чтобы пользователь мог вводить негригорианские значения даты и времени (и я преобразую их в григорианские, прежде чем сохранять в базе данных).

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я нашел решение для анализа моей пользовательской строки даты в 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!Убрал валидатор регулярных выражений и вуаля, все работает!

0 голосов
/ 11 октября 2018

Если вы хотите определить пользовательскую логику проверки, вам нужно создать собственный класс, производный от 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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...