ASP.NET MVC - kundenspezifische Modell Bindemittel können Prozessanordnungen
-
23-09-2019 - |
Frage
Ich brauche eine Funktionalität zu implementieren, damit der Benutzer Preis in irgendeiner Form geben, das heißt 10 USD ermöglichen, $ 10, $ 10, ... als Eingabe.
Ich möchte dies lösen, indem ein benutzerdefiniertes Modell Bindemittel für Preisklasse zu 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 Eigenschaft Preise:
public List<Price> Prices { get; set; }
Das Bindemittel Standardmodell funktioniert gut, solange der Benutzer einen Dezimal-convertible Zeichenfolge in das Eingabe Wert eingibt. Ich möchte Eingaben wie „100 USD“ ermöglichen.
Meine Modelbinder für Preistyp so weit:
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 dass Griffe die Arrays korrekt?
Lösung
Got es: Der Punkt ist nicht zu versuchen, eine einzigen Preis Instanz zu binden, sondern einen Modelbinder für List<Price>
Typen zu 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();