7

Ho bisogno di implementare una funzionalità per consentire agli utenti di inserire il prezzo in qualsiasi forma, cioè di consentire 10 USD, 10 $, $ 10, ... come input.ASP.NET MVC - Raccoglitore modello personalizzato in grado di elaborare array

Vorrei risolvere questo problema implementando un raccoglitore modello personalizzato per classe Price.

class Price { decimal Value; int ID; } 

Il modulo contiene una matrice o prezzi come tasti

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

viewmodel contiene una proprietà prezzi:

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

Il legante modello predefinito funziona bene fintanto che l'utente inserisce un stringa decimale convertibile nell'input del valore. Vorrei inserire input come "100 USD".

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 Raccoglitore modello personalizzato che gestisce correttamente gli array?

+0

faccio a indovinare che ID è l'ID utente e non l'ID del la moneta? – AxelEckenberger

+0

Questo è l'ID del tipo di prezzo, non rilevante per questa domanda – Marek

+0

Non c'è bisogno di più valute - siamo fissati a una singola valuta ma dobbiamo consentire vari tipi di formati di input come menzionato nella domanda – Marek

risposta

16

capito bene: Il punto è quello di non cercare di legare una singola istanza prezzo, ma piuttosto realizzare un ModelBinder per List<Price> Tipo:

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();