mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-14 02:37:08 -07:00
Validation is working on Settings -> Indexers again.
This commit is contained in:
parent
11db27f6ac
commit
1a5b20a48b
7 changed files with 263 additions and 44 deletions
86
NzbDrone.Web/Helpers/Validation/RequiredIfAttribute.cs
Normal file
86
NzbDrone.Web/Helpers/Validation/RequiredIfAttribute.cs
Normal file
|
@ -0,0 +1,86 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace NzbDrone.Web.Helpers.Validation
|
||||
{
|
||||
public class RequiredIfAttribute : ValidationAttribute, IClientValidatable
|
||||
{
|
||||
private RequiredAttribute _innerAttribute = new RequiredAttribute();
|
||||
|
||||
public string DependentProperty { get; set; }
|
||||
public object TargetValue { get; set; }
|
||||
|
||||
public RequiredIfAttribute(string dependentProperty, object targetValue)
|
||||
{
|
||||
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 = "requiredif",
|
||||
};
|
||||
|
||||
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
|
||||
// (the default is True or False!)
|
||||
string targetValue = (this.TargetValue ?? "").ToString();
|
||||
if (this.TargetValue.GetType() == typeof(bool))
|
||||
targetValue = targetValue.ToLower();
|
||||
|
||||
rule.ValidationParameters.Add("dependentproperty", depProp);
|
||||
rule.ValidationParameters.Add("targetvalue", targetValue);
|
||||
|
||||
yield return rule;
|
||||
}
|
||||
|
||||
private string BuildDependentPropertyId(ModelMetadata metadata, ViewContext viewContext)
|
||||
{
|
||||
// build the ID of the property
|
||||
string depProp = viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(this.DependentProperty);
|
||||
// unfortunately 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. Instead, we
|
||||
// want to get the context as though it was one level higher (i.e. outside the current property,
|
||||
// which is the containing object (our Person), and hence the same level as the dependent property.
|
||||
var thisField = metadata.PropertyName + "_";
|
||||
if (depProp.StartsWith(thisField))
|
||||
// strip it off again
|
||||
depProp = depProp.Substring(thisField.Length);
|
||||
return depProp;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue