7

Ich muss eine Funktionalität implementieren, um Benutzern die Eingabe von Preis in beliebiger Form, d. H. 10 USD, 10 $, $ 10, ... als Eingabe zu ermöglichen.ASP.NET MVC - Benutzerdefinierte Modell-Binder in der Lage, Arrays zu verarbeiten

Ich möchte dies lösen, indem Sie ein benutzerdefiniertes Modell Binder für Preisklasse implementieren.

class Price { decimal Value; int ID; } 

Das Formular enthält einen Array oder Preise als Schlüssel

keys: 
"Prices[0].Value" 
"Prices[0].ID" 
"Prices[1].Value" 
"Prices[1].ID" 
... 

Das Ansichtsmodell enthält eine Preis Eigenschaft:

public List<Price> Prices { get; set; } 

Das Bindemittel Standardmodell gut, so lange arbeitet, wie der Benutzer ein eintritt dezimal konvertierbare Zeichenfolge in die Eingabe Wert. Ich möchte Eingaben wie "100 USD" erlauben. so weit

Meine Modelbinder für Preistyp:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    Price res = new Price(); 
    var form = controllerContext.HttpContext.Request.Form; 
    string valueInput = ["Prices[0].Value"]; //how to determine which index I am processing? 
    res.Value = ParseInput(valueInput) 

    return res; 
} 

Wie implementiere ich ein benutzerdefiniertes Modell Binder, der die Arrays korrekt behandelt?

+0

Sie glaube, ich richtig, dass ID ist die Benutzer-ID und nicht die ID Die Währung? – AxelEckenberger

+0

Das ist die ID des Preistyps, nicht relevant für diese Frage – Marek

+0

Keine Notwendigkeit für mehrere Währungen - wir sind auf eine einzige Währung fixiert, müssen aber verschiedene Arten von Eingabeformaten wie in der Frage – Marek

Antwort

16

Verstanden: Der Punkt ist nicht zu versuchen, eine einzigen Preis Instanz zu binden, sondern einen Modelbinder für List<Price> Typen implementieren:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     List<Price> res = new List<Price>(); 
     var form = controllerContext.HttpContext.Request.Form; 
     int i = 0; 
     while (!string.IsNullOrEmpty(form["Prices[" + i + "].PricingTypeID"])) 
     { 
      var p = new Price(); 
      p.Value = Process(form["Prices[" + i + "].Value"]); 
      p.PricingTypeID = int.Parse(form["Prices[" + i + "].PricingTypeID"]); 
      res.Add(p); 
      i++; 
     } 

     return res; 
    } 

//register for List<Price> 
ModelBinders.Binders[typeof(List<Price>)] = new PriceModelBinder(); 
Verwandte Themen