ASP.NET MVC - modello su misura legante in grado di elaborare le matrici
-
23-09-2019 - |
Domanda
Ho bisogno di implementare una funzionalità per consentire agli utenti di immettere prezzo in qualsiasi forma, vale a dire per consentire 10 USD, 10 $, 10 $, ... come input.
Vorrei risolvere questo implementando un modello personalizzato legante per Categoria di prezzo.
class Price { decimal Value; int ID; }
Il modulo contiene un array o prezzi come chiavi
keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
Il ViewModel contiene una proprietà di prezzi:
public List<Price> Prices { get; set; }
Il legante modello predefinito funziona bene fino a quando l'utente inserisce una stringa decimale convertibile all'ingresso Valore. Vorrei consentire ingressi come "100 dollari".
Il mio ModelBinder per Tipo prezzo finora:
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;
}
Come faccio a implementare un modello personalizzato Binder che gestisce correttamente gli array?
Soluzione
capito bene: Il punto è quello di non cercare di legare una singola istanza prezzo, ma piuttosto implementare un ModelBinder per il tipo di List<Price>
:
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();