.Net MVC2 Wie Fehler Model hinzufügen, wenn benutzerdefinierte Validation mit
-
01-10-2019 - |
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
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;
}
}
}