13

2 つの DateTime プロパティを含む MVC4 Prject の ViewModel があります。

[Required]
[DataType(DataType.Date)]
public DateTime RentDate { get; set; }

[Required]
[DataType(DataType.Date)]
public DateTime ReturnDate { get; set; }

[Compare("someProperty")]RentDate プロパティの値が ReturnDate の値よりも早い天気をチェックするために C# 属性を使用する簡単な方法はありますか?

4

6 に答える 6

27

これは、非常に簡単な基本的な実装 (エラー チェックなどなし) であり、要求したことを実行する必要があります (サーバー側でのみ... asp.net クライアント側の JavaScript 検証は実行されません)。私はそれをテストしていませんが、始めるには十分なはずです。

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; }
   }
}
于 2012-12-07T14:54:08.403 に答える
6

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" });
    }
}
于 2012-12-07T14:38:35.167 に答える
2

.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;
    }
于 2012-12-07T15:07:32.453 に答える
1

MVC/Razorでの使用についてはわかりませんが..

DateTime.Compare(t1, t2) を使用できます - t1 と t2 は比較したい時間です。結果に応じて、-1、0、または 1 のいずれかが返されます。

詳細はこちら: http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx

于 2012-12-07T14:09:51.787 に答える
0

そのようなものはフレームワークに存在しません。一般的な同様の属性はRequiredIfです。この投稿で説明されています。

RequiredIf条件付き検証属性

于 2012-12-07T14:10:50.050 に答える