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.

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top