0

我知道有data annotation驗證數據,如[Required][Range()]等。更不用說unobtrusive validation,它使客戶端更容易。非常感謝他們。驗證取決於其他實體屬性值的傳入請求?

但是如果您需要驗證取決於實體屬性值的值,那麼該怎麼辦?我有這個scenarion,說:

我的模型:

public class Schedule 
{ 
    public int Id { get; set; } 
    public DatetimeOffset StartDate { get; set; } 
    public DatetimeOffset EndDate { get; set; } 
} 

現在在form

<input type="text" name="StartDate" /> 
<input type="text" name="EndDate" /> 

你會如何驗證該EndDate不應該less thanStartDate?對於data annotation是否有內置的attribute?或者應該定製一個?如果它能夠通過微軟使用unobstrusive validation,那將是一件好事。

這裏是另一種情況:

如果你要這麼做取決於保存在分貝值驗證?再說了,

public class Bag 
{ 
    //constructor 
    public int Capacity { get; set; } 

    public virtual ICollection<Item> Items { get; set; } 
} 

public class Item 
{ 
    //constructor 
    public string Description { get; set; } 

    public virtual ICollection<Bag> Bags { get; set; } 
} 

也就是說,如果你會做的Items驗證被添加到Bag但如果用戶試圖輸入超出極限的BagCapacity,應顯示驗證錯誤。

這可能嗎?

我目前正在使用ASP.NET MVC 4. EF5代碼的第一種方法。

回答

1

第一種方法是實現IValidatableObject

public class Schedule : IValidatableObject 
{ 
    public int Id { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (StartDate > EndDate) 
     { 
      yield return new ValidationResult("End date must be greater than start date.", new [] { "EndDate"}); 
     } 
    } 
} 

將模型在服務器端綁定過程中自動執行。

如果你想驗證客戶端,你也有選擇。其中之一是遠程驗證。你可以閱讀關於它here。總結一下:您必須創建constroller和action,它需要驗證的值並在有效或不有效時返回。它可能需要多個值。例如ID和用戶名,如果你想檢查唯一性。

在日期比較中,顯然不需要將值發送到服務器。你可以實現你自己的驗證屬性來處理客戶端的比較。有人試圖執行它here

相關問題