1

我正在創建用於創建事件的ASP.NET MVC 4 Web項目。活動有開始和結束日期。如果開始日期已經開始,我創建了自定義驗證屬性以防止保存事件模型(類)實例。 這是自定義的驗證屬性碼:如何爲創建和編輯具有不同行爲的動作創建一個自定義驗證屬性

public class NoPastDateAttribute : ValidationAttribute 
{ 
    public NoPastDateAttribute() 
     : base(ValidationStrings.DateStarted) 
    { 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value != null) 
     { 
      var valueDate = DateTime.Parse(value.ToString()); 
      if (valueDate < DateTime.Now) 
      { 
       return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
      } 
     } 
     return ValidationResult.Success; 
    } 
} 

當我創建事件模型(類)的新實例是沒有問題的。我的自定義驗證屬性工作正常。它驗證開始日期,並在開始日期已經開始時防止保存。但是,當我編輯已經創建的Event實例時(例如我更改了Name),我的驗證屬性不允許我保存這個新名稱,因爲startdate。 (如果開始日期尚未啓動)

這裏是我的事件模型(類):

public class Event 
{ 
    public Guid Id { get; set; } 

    public string Name { get; set; } 

    [NoPastDate] 
    public DateTime StartDate { get; set; } 

    public DateTime EndDate { get; set; } 


} 

我怎樣才能解決這個問題?

更新:我使用科林的建議,並添加了IValidatableObject接口的實現,並且還添加了RowVersion(timeStamp)。它幫助了我,但我不確定這個解決方案的效率如何。 所以,這裏是我更新的類:

public class Event : IValidatableObject 
{ 
    public Guid Id { get; set; } 

    public string Name { get; set; } 

    public byte[] RowVersion { get; set; } 

    public DateTime StartDate { get; set; } 

    public DateTime EndDate { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (RowVersion == null && this.StartDate < DateTime.Now) 
     { 
      yield return 
       new ValidationResult("Date already started"); 
     } 

    } 
} 

回答

1

把你的屬性上的視圖模型用於創建和擁有編輯不同的視圖模型。和/或實施IValidatableObject實現模型級別驗證,檢查ID是否是其類型作爲測試的默認創建或編輯:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (ID == Guid.Empty && this.StartDate < DateTime.Now) 
    { 
     yield return 
      new ValidationResult("Date already started"); 
    } 
} 
+0

的問題是,我使用的GUID標識的(不是int),所以它已經有一個值 –

+0

'Guid'的默認值是'Guid.Empty',所以請檢查它,而不是int的默認值。看我的編輯 – Colin

相關問題