Подтвердить что ты не робот

Константа DateTime в С#

Я хотел бы поместить постоянное время даты в параметр атрибута, как мне сделать постоянное datetime? Он связан с ValidationAttribute блока приложения проверки EntLib, но также применяется и к другим атрибутам.

Когда я это сделаю:

private DateTime _lowerbound = new DateTime(2011, 1, 1);
[DateTimeRangeValidator(_lowerbound)]

Я получу:

An object reference is required for the non-static field, method, or property _lowerbound

И делая это

private const DateTime _lowerbound = new DateTime(2011, 1, 1);
[DateTimeRangeValidator(_lowerbound)]

Я получу:

Тип 'System.DateTime' не может быть объявлен const

Любые идеи? Не рекомендуется использовать этот путь:

[DateTimeRangeValidator("01-01-2011")]
4b9b3361

Ответ 1

Решение, о котором я всегда читал, состоит в том, чтобы либо пройти маршрут строки, либо перейти в день/месяц/год как три отдельных параметра, так как С# в настоящее время не поддерживает литеральное значение DateTime.

Вот простой пример, который позволит вам передать в атрибут либо три параметра типа int, либо string:

public class SomeDateTimeAttribute : Attribute
{
    private DateTime _date;

    public SomeDateTimeAttribute(int year, int month, int day)
    {
        _date = new DateTime(year, month, day);
    }

    public SomeDateTimeAttribute(string date)
    {
        _date = DateTime.Parse(date);
    }

    public DateTime Date
    {
        get { return _date; }
    }

    public bool IsAfterToday()
    {
        return this.Date > DateTime.Today;
    }
}

Ответ 2

Как отмечают некоторые из предыдущих ответов, const DateTime не поддерживается на С# и не может использоваться как параметр атрибута. Тем не менее, a readonly DateTime (рекомендуется по const в Эффективном С#, 2-е издание [Пункт 2]) является простым обходным путем для других ситуаций следующим образом:

public class MyClass
{
    public static readonly DateTime DefaultDate = new DateTime(1900,1,1);
}

Ответ 3

DateTimeRangeValidator может принимать строковое представление (формат ISO8601) в качестве параметра

например

                            LowerBound              UpperBound
[DateTimeRangeValidator("2010-01-01T00:00:00",  "2010-01-20T00:00:00")]

Один параметр будет интерпретироваться как UpperBound, поэтому вам нужно 2, если вы хотите ввести нижний бит. Проверьте документы, чтобы узнать, есть ли специальное значение "не важно" для UpperBound или если вам нужно установить его на очень далекую будущую дату.

Упс, просто перечитайте и заметите

"Идти таким образом не предпочтительнее"

[DateTimeRangeValidator("01-01-2011")]

Почему бы и нет?

Would

private const string LowerBound = "2010-01-01T00:00:00";
private const string UpperBound = "2010-01-20T00:00:00";

[DateTimeRangeValidator(LowerBound, UpperBound)]

будет хуже/отличается от (формат даты в формате VB)

private const DateTime LowerBound = #01/01/2000 00:00 AM#;
private const DateTime UpperBound = #20/01/2000 11:59 PM#;

[DateTimeRangeValidator(LowerBound, UpperBound)]

hth,
Алан

Ответ 4

Одним из решений является разделение даты на поля дня, месяца и года, а затем расширение RangeAttribute Таким образом, вы получаете все преимущества встроенной проверки.

См. пример ниже:

public class PermittedYearRangeAttribute : RangeAttribute
{
    public PermittedYearRangeAttribute()
        : base(1900, DateTime.Now.AddYears(-50).Year)
    {
        ErrorMessage = string.Format("Year must be between 1900 and {0}", DateTime.Now.AddYears(-50).Year);
    }
}

В Global.asax.cs Application_Start() добавьте следующую строку

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(PermittedYearRangeAttribute), typeof(RangeAttributeAdapter));

В модели Украсить свойства:

    [Required(ErrorMessage = "Please enter year")]
    [PermittedYearRange]
    public int Year { get; set; }

    [Required(ErrorMessage = "Please enter day")]
    [Range(1, 31, ErrorMessage = "Day must be between 1 and 31")]
    public int Day { get; set; }

    [Required(ErrorMessage = "Please enter month")]
    [Range(1, 31, ErrorMessage = "Month must be between 1 and 12")]
    public int Month { get; set; }

Html rendered:

 <input class="tooltip form-control input dob--input input-validation-error" data-val="true" data-val-number="The field Year must be a number." data-val-range="Year must be between 1900 and 1965" data-val-range-max="1965" data-val-range-min="1900" data-val-required="Please enter year" id="Year" maxlength="4096" name="Year" placeholder="YYYY" tabindex="" type="text" value="0">