Обязательный атрибут для свойства DateTime - PullRequest
2 голосов
/ 06 июня 2011

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

[DisplayName("Appointed Date")]
[Required(ErrorMessage = "Appointed Date Is Required")]
public virtual DateTime AppointedDate { get; set; }

Пожалуйста, дайте мне знать, если мне нужно сделать что-то еще.

1 Ответ

3 голосов
/ 04 мая 2012

Обычно это связано с ненулевыми типами, которые не выполняются в подшивке модели при разборе.Сделайте дату недействительной в модели и посмотрите, решит ли это вашу проблему.В противном случае, напишите свой собственный связыватель модели и обработайте его лучше.

Редактировать: И под моделью я подразумеваю модель представления для представления, чтобы внести рекомендуемые изменения, если вы хотите придерживаться привязки к вашей модели вview (который, как я предполагаю, использует EF), следуйте предложению написать свою собственную модель подшивки

Редактировать 2: Мы сделали что-то вроде этого, чтобы получить пользовательский формат для анализа в обнуляемой дате / времени (что может быть хорошимначните настраивать тип, отличный от nullable):


public sealed class DateTimeBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }

        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }

        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

        if (valueProviderResult == null)
        {
            return null;
        }

        var attemptedValue = valueProviderResult.AttemptedValue;

        return ParseDateTimeInfo(bindingContext, attemptedValue);
    }

    private static DateTime? ParseDateTimeInfo(ModelBindingContext bindingContext, string attemptedValue)
    {
        if (string.IsNullOrEmpty(attemptedValue))
        {
            return null;
        }

        if (!Regex.IsMatch(attemptedValue, @"^\d{2}-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{4}$", RegexOptions.IgnoreCase))
        {
            var displayName = bindingContext.ModelMetadata.DisplayName;
            var errorMessage = string.Format("{0} must be in the format DD-MMM-YYYY", displayName);
            bindingContext.ModelState.AddModelError(bindingContext.ModelMetadata.PropertyName, errorMessage);
            return null;
        }

        return DateTime.Parse(attemptedValue);
    }
}

Затем зарегистрируйте это с помощью (указав этот класс в контейнере для ввода зависимостей):


public class EventOrganizerProviders : IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
        if (modelType == typeof(DateTime))
        {
            return new DateTimeBinder();
        }

                // Other types follow
        if (modelType == typeof(TimeSpan?))
        {
            return new TimeSpanBinder();
        }

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