Frage

Ich habe folgende Validation Klasse

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class DateValidationAttribute : ValidationAttribute
{
    public DateValidationAttribute(string leftDateProperty, CompareOperator compareOperator, string rightDateProperty, string errorMessage)
            : base(errorMessage)
    {
        LeftDateProperty = leftDateProperty;
        Operator = compareOperator;
        RightDateProperty = rightDateProperty;
    }
    ...
    ...
}

Es dauert zwei Datumseigenschaftsnamen und einen Operator im Konstruktor.

In der Validierungsmethode das Ergebnis der Anweisung LeftDate Operator RightDate zurückgeführt wird.

public override bool IsValid(object value)
{
    DateTime leftDate;
    DateTime rightDate;

    // Get all properties on the view model
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);

    DateTime rightDate = (DateTime)properties.Find(RightDateProperty, true).GetValue(value);
    DateTime leftDate = (DateTime)properties.Find(LeftDateProperty, true).GetValue(value);

    // Perform rule check
    switch (Operator)
    {
        case CompareOperator.Equal:
            return leftDate.Equals(rightDate);
        case CompareOperator.Greater:                    
            return leftDate > rightDate;
        case CompareOperator.Lesser:                    
            return leftDate < rightDate;
        case CompareOperator.GreaterOrEqual:                    
            return leftDate >= rightDate;
        case CompareOperator.LesserOrEqual:                    
            return leftDate <= rightDate;
        default:
            return false;
    }
}

Da es sich um ein AttriuteTargets.Class Attribut Ich weiß, es unmöglich ist, den Rahmen zu wissen, welche Eigenschaft, dass die Validierung verursacht scheitern. Aber ich weiß, dass es links Datum Eigentum ist, die fehlschlägt und deshalb mag ich in dem Model diese Eigenschaft der Id des Fehlers setzen. Der Grund dafür ist, dass ich das fehlerhafte Feld im Formular markiert werden soll.

Frage: Wie kann ich den Fehler Artikel ändern, um die Fehlersammlung in Modeln hinzugefügt, so dass seine ID entspricht ein bestimmtes Feld in der Form

War es hilfreich?

Lösung

fand ich einen besseren Weg, dies zu tun mit IDataErrorInfo

Hier ist, wie ich es mache. Es ist nicht so allgemein wie das Beispiel in der Frage. Mit dieser Lösung müssen Sie jede Kontrolle codieren. Aber jetzt wird die Validierung arbeiten schön den ganzen Weg auf die Javascript und Hervorhebung des versagenden Eingangselement.

public class TestModel: IDataErrorInfo
{

    public TestModel()
    {
    }

    [Required]
    public string StartDate { get; set; }

    [Required]
    public string EndDate { get; set; }

    #region IDataErrorInfo Members

    public string Error
    {
        get
        {
            return string.Empty;
        }
    }

    public string this[string columnName]
    {
        get
        {
            switch (columnName)
            {
                case "StartDate":
                    {
                        if (StartDate < DateTime.Today)
                        {
                            return "Start date must not be a date in the past";
                        }
                        break;
                    }
                case "EndDate":
                    {
                        if (EndDate < StartDate)
                        {
                            return "End date must not be a date before start date";
                        }
                        break;
                    }   
                default:
                    return string.Empty;
            }
            return string.Empty;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top