ASP.NET MVC - liant modèle personnalisé capable de traiter des tableaux
-
23-09-2019 - |
Question
Je dois mettre en œuvre une fonctionnalité pour permettre aux utilisateurs d'entrer le prix, sous quelque forme, à savoir pour permettre à 10 USD, 10 $, 10 $, ... comme entrée.
Je voudrais résoudre ce problème en mettant en œuvre un modèle de liaison personnalisé pour la classe de prix.
class Price { decimal Value; int ID; }
Le formulaire contient un tableau ou aux prix clés
keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
Le ViewModel contient une propriété Prix:
public List<Price> Prices { get; set; }
Le liant de modèle par défaut fonctionne bien aussi longtemps que l'utilisateur entre une chaîne décimale convertible dans l'entrée de la valeur. Je voudrais permettre à des entrées comme « 100 USD ».
Mon ModelBinder pour le type de prix à ce jour:
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;
}
Comment puis-je mettre un modèle personnalisé Binder qui gère les tableaux correctement?
La solution
Got it: Le point est d'essayer de ne pas se lier à une seule instance de prix, mais plutôt mettre en œuvre un ModelBinder pour le type de 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();