簡體   English   中英

如何創建具有多個屬性依賴項的自定義驗證

[英]How to create custom validation with multiple property dependencies

我正在努力驗證某些值,希望有人能指出正確的方向。

考慮下面的類(它已被簡化,省去了不需要的列來解決問題):

using System;
using System.Collections.Generic;

public partial class Data_Header
{
    public Data_Header()
    {
        this.Data_Lines = new HashSet<Data_Lines>();
    }

    public int DataHeaderID { get; set; }
    public System.Guid CmpWwn { get; set; }
    public System.Guid CntId { get; set; }
    public System.DateTime DeliveryDate { get; set; }
    public Nullable<int> DeliveryMethod_SysDeliveryMethodsID { get; set; }
    public System.DateTime DueDate { get; set; }

    public virtual Sys_DeliveryMethods Sys_DeliveryMethods { get; set; }
    public virtual vw_cicmpy vw_cicmpy { get; set; }
    public virtual ICollection<Data_Lines> Data_Lines { get; set; }
}

我為CmpWwn和CntId創建驗證所要做的就是創建一個名為RequiredGuidAttribute的自定義屬性,該屬性在StackOverflow上的某個地方找到:

public class RequiredGuidAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        var guid = CastToGuidOrDefault(value);

        return !Equals(guid, default(Guid));
    }

    private static Guid CastToGuidOrDefault(object value)
    {
        try
        {
            return (Guid)value;
        }
        catch (Exception e)
        {
            if (e is InvalidCastException || e is NullReferenceException) return default(Guid);
            throw;
        }
    }
}

因此,我可以使用此批注來驗證Guid值。 這不是很困難,我理解原理。 現在下一個問題:

我想確保DueDate的值永遠不會在當前日期之前,也永遠不會在DeliveryDate屬性的值之前,甚至更多,DueDate的值應該是基於DeliveryMethod的計算值

我不知所措; 如何創建這樣的驗證? 我知道我可以簡單地使用一種返回帶有幾個if語句的true或false的方法,但是如果可能的話,我想使用數據注釋,以便可以使用相同的錯誤處理程序。

我在實體框架6中使用數據庫優先。

確保使用ValidationContext覆蓋IsValid,以訪問您的基礎對象。 然后按照您的Guid進行DueDate:

public override bool IsValid(object value, ValidationContext validationContext)
{
    var dataHeader = validationContext.ObjectInstance as Data_Header;
    var dueDate = dataHeader.CalculateDueDate;
    bool isValid = false;

    if (dueDate.CompareTo(DateTime.Now) < 0 ||
        dueDate.CompareTo(dataHeader.DeliveryDate) < 0)
    {
       isValid = false;
    }

    return isValid;
}

這樣的事情應該做。 您可以像以前在Guid上一樣處理此問題。 如果調用Validation,則在ValidationContext中輸入:

例如:

var results = new List<ValidationResult>();
Validator.TryValidateObject(this, new ValidationContext(YOUR_OBJECT_TO_VALIDATE, null, null), results, true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM