Needing Eigenschaften zu kopieren, bevor die Validierung
-
04-10-2019 - |
Frage
Ich habe ein ziemlich komplexes Modell validiert werden zu müssen, ist das Problem, dass dieses Modell auf zwei verschiedenen Orten verwendet wird, ein, wo Sie Ihre Kunden zu registrieren und einem, wo man einfach Adressen hinzufügen. Einige Felder auf der Adresse sind einfach nicht sichtbar auf dem Register Kundenformular. Wenn ich also, wenn ModelState.IsValid prüfe ich bekommen falsch natürlich da zB. der Name ist nicht auf die Rechnungsadresse eingegeben, aber es ist auf den Kunden. Deshalb habe ich zu wollen, vor der Validierung auftritt, kopieren, um ein paar Felder zu dem Modell, und dann auf Validieren. Ich bin ein wenig verloren, obwohl und ich brauche Hilfe.
Meine Aktion sieht etwa so aus:
public ActionResult Register(WebCustomer customer)
{
customer.CopyProperties();
if(TryUpdateModel(customer))
{
...
}
...
Aber es gibt immer false zurück, und ModelState.IsValid weiterhin falsch.
Lösung
Ich denke, dass der beste Ansatz in dieser Situation ist CustomModelBinder zu schreiben, und es auf Ihren Aktionsparameter
public ActionResult Register([ModelBinder(typeof(WebCustomerRegisterBinder))]WebCustomer customer)
{
if(TryUpdateModel(customer))
{
...
}
...
}
Dieses CustomModelBinder sollte das Kopieren Felder kümmern, und weil seine Handlungs angewandt Parameter nur in dieser Aktion verwendet wird.
Andere Tipps
Binder arbeitet an Formularwerte. Also, Ihr Model ist immer einen Fehler aus. Sie haben Ihre Eigenschaften in Ihrem Unternehmen oder zweite Option des Schreib Ihr eigenes Modell Bindemittel zu überprüfen. zB.
public class Customer
{
public bool IsValid()
{
//TODO: check properties.
}
}
public ActionResult Register(WebCustomer customer)
{
customer.CopyProperties();
TryUpdateModel(customer);
if (customer.IsValid())
{
...
}
...
Ich löste es ein bisschen diffferently, nicht sicher, ob es der beste Weg ist, aber:
Zuerst machte ich eine Erweiterungsmethode für die Modelstate
public static void ResetErrors(this ModelStateDictionary modelState)
{
foreach (var error in modelState.Values.Select(m => m.Errors))
{
error.Clear();
}
}
Dann habe ich folgendes in meiner Aktion:
ModelState.ResetErrors();
customer.CopyProperties();
ValidateModel(customer);