MVC.Net Core Model Validation - значение '' недействительно. ошибка

Я пытаюсь использовать проверку модели в MVC.Net Core и не могу заменить это сообщение об ошибке по умолчанию "Значение" недопустимо.

В теории мы можем заменить собственное собственное сообщение об ошибке, используя ErrorMessage Annotation в модели. Но я не мог найти способ заставить эту работу работать.

Моя модель

[Required(ErrorMessage = "Date Required")]
[DataType(DataType.Date, ErrorMessage = "Invalid Date Format")]                
[Display(Name = "Appointment Date")]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime AppointmentDate { get; set; }

Я помещаю разные ErrorMessage для тегов Required и DataType, как показано выше.

Мой просмотр html

    <div class="col-md-2">
        <input class="form-control" asp-for="AppointmentDate">
        <span asp-validation-for="AppointmentDate" class="text-danger"></span>
    </div>

введите описание изображения здесь

Не могли бы вы помочь мне, как я могу заменить это сообщение об ошибке? Спасибо.

Ответ 1

Чтобы сделать ваш атрибут Required, вам нужно сделать поле нулевым:

public DateTime? AppointmentDate { get; set; }

Изменить: также обратите внимание, что атрибут DataType фактически не выполняет проверку в поле. MVC проверяет дату при применении привязки данных post к model

Ответ 2

Моя проблема заключалась в том, что в Create Action я вернул View без создания объекта Entity, который, когда я его изменил, т.е. Return View(new MyEntity());, исправил проблему

Ответ 3

Наличие той же проблемы, но не может обнаружить проблему. Я проверил объект в режиме отладки, чтобы увидеть, есть ли способ узнать, какое свойство не соответствует состоянию модели.

Debug mode view of the modelstate object

Тогда я вижу, какая модель не подходит. Это логическое значение, которое отображается на флажок

Странная часть: "это не обязательное поле"!

Я добавил знак вопроса и использовал метод getvalueordefault при его использовании

public bool? IsCorporateAccount { get; set; }