ASP.NET MVC - modelo personalizado de carpetas capaz de matrices de procesos
-
23-09-2019 - |
Pregunta
necesito para implementar una funcionalidad para permitir a los usuarios introducir el precio de cualquier forma, es decir, para que el 10 USD, $ 10, $ 10, ... como entrada.
Me gustaría resolver esto mediante la aplicación de un ligante modelo personalizado para la clase de precio.
class Price { decimal Value; int ID; }
El formulario contiene una matriz o precios como teclas
keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
El modelo de vista contiene una propiedad de precios:
public List<Price> Prices { get; set; }
El aglutinante modelo por defecto funciona muy bien siempre y cuando el usuario introduce una cadena decimal convertibles en la entrada de valor. Me gustaría permitir insumos como "100 dólares".
Mi ModelBinder para el tipo de precio hasta el momento:
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;
}
¿Cómo se implementa un modelo personalizado Carpeta que se encarga de los arreglos correctamente?
Solución
Entendido: El punto es no tratar de obligar a una sola instancia de precio, sino más bien poner en práctica un ModelBinder para el tipo 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();