0

I have a class model as below:

public class QuataShareSurplussFormModel
{

    public QuataShareSurplussOfferLetterModel offeredLetters { get; set; }
    [ListValidations]
    [ListDuplicateValidations]
    public List<QuataShareClassModel> quataShareClass { get; set; }
    [ListValidations]
    [ListDuplicateValidations]
    public List<SurplusClassModel> surplusClass { get; set; }
    [ListDuplicateValidations]
    public List<OfferedLettersClauseModel> lettersClauses { get; set; }
    [ListDuplicateValidations]
    public List<OfferedLettersExclusionsModel> lettersExclusions { get; set; }
    [ListDuplicateValidations]
    public List<OfferedLettersGeneralConditionsModel> lettersGeneralConditions { get; set; }
    [ListDuplicateValidations]
    public List<OfferedLettersSpecialConditionsModel> lettersSpecialConditions { get; set; }
    [ListDuplicateValidations]
    public List<OfferedLettersGeneralExclusionsModel> lettersGeneralExclusions { get; set; }

}

quataShareClass property has the following items:

public class QuataShareClassModel
{
    public int offeredLetterId { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(1, int.MaxValue)]
    public int? classId { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, long.MaxValue)]
    public long? maxLimitOfCover { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, byte.MaxValue)]
    public byte? baseDataServiceCurrencyTypeId { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, int.MaxValue)]
    public Nullable<int> exchangeRate { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, long.MaxValue)]
    [CalculativeIRRCheck(nameof(maxLimitOfCover), nameof(exchangeRate))]
    public long? maxLimitOfCoverInIRR { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, byte.MaxValue)]
    public long? commission { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(1, int.MaxValue)]
    public int? lastLossRatio { get; set; }
}

For example, say i want to validate commission property

public class PropRangeValidation : RangeAttribute
{
    private readonly double _Minimum;
    private readonly double _Maximum;

    public PropRangeValidation(double minimum, double maximum) : base( minimum, maximum)
    {
        this._Minimum = minimum;
        this._Maximum = maximum;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var valueStr = value?.ToString();
        var valueDbl = Convert.ToDouble(valueStr);

        if ((valueDbl < _Minimum || valueDbl > _Maximum) && valueStr!=null)
        {
            var memberName = validationContext.MemberName;
            var errorMsg = string.Format(Resources.RangeViolation, valueDbl, memberName);
            var errorCode = ValidationError.Required.ToString();
            var error = string.Format("{0}|{1}|{2}", errorMsg, errorCode, memberName);
            return new ValidationResult(error);
        }
        return null;


    }
}

How to get commission parent property name from ValidationContext ? i mean

public List<QuataShareClassModel> quataShareClass { get; set; }

I need to get quataShareClass name.

Something like this:

var parentProp=ValidationContext.ParentProperty //results to `quataShareClass`
Abolfazl
  • 1,592
  • 11
  • 32

1 Answers1

0

I suggest you implement IValidatableObject interface. It determines whether the specified object is valid or not. There is a Validate method that returns a collection of ValidationResult so you can use yield return to get the results. You do not need to call the Validate method, it manages by .net.

public class QuataShareClassModel : IValidatableObject
{
    public int offeredLetterId { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(1, int.MaxValue)]
    public int? classId { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, long.MaxValue)]
    public long? maxLimitOfCover { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, byte.MaxValue)]
    public byte? baseDataServiceCurrencyTypeId { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, int.MaxValue)]
    public Nullable<int> exchangeRate { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, long.MaxValue)]
    [CalculativeIRRCheck(nameof(maxLimitOfCover), nameof(exchangeRate))]
    public long? maxLimitOfCoverInIRR { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(0, byte.MaxValue)]
    public long? commission { get; set; }
    [PropRequiredValidation]
    [PropRangeValidation(1, int.MaxValue)]
    public int? lastLossRatio { get; set; }

    public QuataShareSurplussFormModel QuataShareSurplussFormModel { get; set; }
    
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (condition)
            yield return new ValidationResult("your message...", new[]
            {
                nameof([YourProperName])
            });

        if (condition)
            yield return new ValidationResult("your massage...", new[]
            {
                nameof(YourProperName1), nameof(YourProperName2)
            });
    }
}

Take a look at IValidatableObject Interface

UPDATE:

Add inverse navigation property to access QuataShareSurplussFormModel.

mohabbati
  • 1,162
  • 1
  • 13
  • 31
  • Thanks for your answer Mohammad , but please elaborate on the details,How object validation is going to be helping finding parent property name in main class? – Abolfazl Apr 12 '21 at 18:33
  • @Abolfazl you can implement `IValidatableObject` in the **superclass** instead of **derived class**, by this you can validate `commission` property and also access to the *parent property name*. – mohabbati Apr 13 '21 at 07:09
  • @Abolfazl In your **derived class** there is no **inverse navigation property** to access the **superclass**. So you can add inverse navigation property to access the *parent property name*. – mohabbati Apr 13 '21 at 07:11