С#, чтобы проверить, была ли одна дата раньше другой
У меня есть ViewModel для моего MVC4 Prject, содержащего два свойства DateTime:
[Required]
[DataType(DataType.Date)]
public DateTime RentDate { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime ReturnDate { get; set; }
Есть ли простой способ использовать атрибуты С# в качестве [Compare("someProperty")]
для проверки погоды значение свойства RentDate раньше значения ReturnDate?
Ответы
Ответ 1
Вот очень быстрая базовая реализация (без проверки ошибок и т.д.), которая должна делать то, что вы просите (только на стороне сервера... она не будет проверять JavaScript на стороне клиента asp.net). Я не тестировал его, но должен быть достаточно, чтобы вы начали.
using System;
using System.ComponentModel.DataAnnotations;
namespace Test
{
[AttributeUsage(AttributeTargets.Property)]
public class DateGreaterThanAttribute : ValidationAttribute
{
public DateGreaterThanAttribute(string dateToCompareToFieldName)
{
DateToCompareToFieldName = dateToCompareToFieldName;
}
private string DateToCompareToFieldName { get; set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
DateTime earlierDate = (DateTime)value;
DateTime laterDate = (DateTime)validationContext.ObjectType.GetProperty(DateToCompareToFieldName).GetValue(validationContext.ObjectInstance, null);
if (laterDate > earlierDate)
{
return ValidationResult.Success;
}
else
{
return new ValidationResult("Date is not later");
}
}
}
public class TestClass
{
[DateGreaterThan("ReturnDate")]
public DateTime RentDate { get; set; }
public DateTime ReturnDate { get; set; }
}
}
Ответ 2
Похоже, вы используете DataAnnotations, поэтому другой альтернативой является реализация IValidatableObject
в модели представления:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.RentDate > this.ReturnDate)
{
yield return new ValidationResult("Rent date must be prior to return date", new[] { "RentDate" });
}
}
Ответ 3
Если вы используете .Net Framework 3.0 или выше, вы можете сделать это как расширение класса...
/// <summary>
/// Determines if a <code>DateTime</code> falls before another <code>DateTime</code> (inclusive)
/// </summary>
/// <param name="dt">The <code>DateTime</code> being tested</param>
/// <param name="compare">The <code>DateTime</code> used for the comparison</param>
/// <returns><code>bool</code></returns>
public static bool isBefore(this DateTime dt, DateTime compare)
{
return dt.Ticks <= compare.Ticks;
}
/// <summary>
/// Determines if a <code>DateTime</code> falls after another <code>DateTime</code> (inclusive)
/// </summary>
/// <param name="dt">The <code>DateTime</code> being tested</param>
/// <param name="compare">The <code>DateTime</code> used for the comparison</param>
/// <returns><code>bool</code></returns>
public static bool isAfter(this DateTime dt, DateTime compare)
{
return dt.Ticks >= compare.Ticks;
}
Ответ 4
Не уверен, что он используется в MVC/Razor, но..
Вы можете использовать DateTime.Compare(t1, t2) - t1 и t2 - время, которое вы хотите сравнить. Он вернет либо -1, 0, либо 1 в зависимости от результатов.
Подробнее здесь:
http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx
Ответ 5
Ничего подобного в структуре не существует. Общим аналогичным атрибутом является RequiredIf
. Он описан в этом сообщении.
RequiredIf Атрибут условной проверки
Ответ 6
Модель:
[DateCorrectRange(ValidateStartDate = true, ErrorMessage = "Start date shouldn't be older than the current date")]
public DateTime StartDate { get; set; }
[DateCorrectRange(ValidateEndDate = true, ErrorMessage = "End date can't be younger than start date")]
public DateTime EndDate { get; set; }
Класс атрибута:
[AttributeUsage(AttributeTargets.Property)]
public class DateCorrectRangeAttribute : ValidationAttribute
{
public bool ValidateStartDate { get; set; }
public bool ValidateEndDate { get; set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = validationContext.ObjectInstance as YourModelType;
if (model != null)
{
if (model.StartDate > model.EndDate && ValidateEndDate
|| model.StartDate > DateTime.Now.Date && ValidateStartDate)
{
return new ValidationResult(string.Empty);
}
}
return ValidationResult.Success;
}
}