Необходимость условной аннотации данных требует проверки поля на основе значения другого поля подмодели - PullRequest
0 голосов
/ 04 мая 2019

Необходима аннотация данных для обязательной проверки поля на основе значения поля, которое находится в подмодели

Необходимо иметь обязательную проверку поля для PatientViewModel.MiddleName, когда значение PatientViewModel.PatientSettingViewModel.MiddleName равно true

public partial class PatientViewModel
{
     [DisplayName("Patient ID")]
     public string PatientId { get; set; }

     public PatientSettingViewModel patientSetting { get; set; }

     [RequiredIf("patientSetting.MiddleName", true, ErrorMessage = "Middle Name is Required")]
     [LettersOnly]
     [MaxLength(20, ErrorMessage = "Maximum length is 20.")]
     public string MiddleName { get; set; }
}

public class PatientSettingViewModel : BaseEntity
{
    [DisplayName("Middle Name")]
    public bool MiddleName { get; set; }
}

public class RequiredIfAttribute : ConditionalValidationAttribute
{
    protected override string ValidationName
    {
        get { return "requiredif"; }
    }
    public RequiredIfAttribute(string dependentProperty, object targetValue) : base(new RequiredAttribute(), dependentProperty, targetValue)
    {
    }
    protected override IDictionary<string, object> GetExtraValidationParameters()
    {
        return new Dictionary<string, object> { { "rule", "required" }        };
    }
}

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public abstract class ConditionalValidationAttribute : ValidationAttribute, IClientValidatable
{
      protected readonly ValidationAttribute InnerAttribute;
      public string DependentProperty { get; set; }
      public object TargetValue { get; set; }
      protected abstract string ValidationName { get; }

      protected virtual IDictionary<string, object> GetExtraValidationParameters()
     {
    return new Dictionary<string, object>();
}

protected ConditionalValidationAttribute(ValidationAttribute innerAttribute, string dependentProperty, object targetValue)
{
    this.InnerAttribute = innerAttribute;
    this.DependentProperty = dependentProperty;
    this.TargetValue = targetValue;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    // get a reference to the property this validation depends upon
    var containerType = validationContext.ObjectInstance.GetType();
    var field = containerType.GetProperty(this.DependentProperty);
    if (field != null)
    {
        // get the value of the dependent property
        var dependentvalue = field.GetValue(validationContext.ObjectInstance, null);

        // compare the value against the target value
        if ((dependentvalue == null && this.TargetValue == null) || (dependentvalue != null && dependentvalue.Equals(this.TargetValue)))
        {
            // match => means we should try validating this field
            if (!InnerAttribute.IsValid(value))
            {
                // validation failed - return an error
                return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName });
            }
        }
    }
    return ValidationResult.Success;
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule()
    {
        ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
        ValidationType = ValidationName,
    };
    string depProp = BuildDependentPropertyId(metadata, context as ViewContext);
    // find the value on the control we depend on; if it's a bool, format it javascript style
    string targetValue = (this.TargetValue ?? "").ToString();
    if (this.TargetValue.GetType() == typeof(bool))
    {
        targetValue = targetValue.ToLower();
    }
    rule.ValidationParameters.Add("dependentproperty", depProp);
    rule.ValidationParameters.Add("targetvalue", targetValue);
    // Add the extra params, if any
    foreach (var param in GetExtraValidationParameters())
    {
        rule.ValidationParameters.Add(param);
    }
    yield return rule;
}

private string BuildDependentPropertyId(ModelMetadata metadata, ViewContext viewContext)
{
    string depProp = viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(this.DependentProperty);
    // This will have the name of the current field appended to the beginning, because the TemplateInfo's context has had this fieldname appended to it.
    var thisField = metadata.PropertyName + "_";
    if (depProp.StartsWith(thisField))
    {
        depProp = depProp.Substring(thisField.Length);
    }
    return depProp;
}

}

Я могу добиться желаемого результата, если я помещаю значение bool в ту же модель, но я хочу получить условную обязательную проверку на основе значения bool подмодели.

1 Ответ

0 голосов
/ 05 мая 2019

Пожалуйста, используйте Свободная проверка или Полная проверка библиотека для проверки модели и подмодели.

Спасибо.

...