7

Necesito implementar una funcionalidad para permitir a los usuarios introducir el precio en cualquier forma, es decir, para permitir 10 USD, 10 $, $ 10, ... como entrada.ASP.NET MVC - Carpeta de modelo personalizado capaz de procesar matrices

Me gustaría solucionar esto implementando un encuadernador de 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 ViewModel contiene un precios de la propiedad:

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

El aglutinante modelo por defecto funciona muy bien, siempre y cuando el usuario introduce una cadena decimal convertible en la entrada de Valor. Me gustaría permitir entradas como "100 USD".

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 de Cuaderno personalizado que controla las matrices correctamente?

+0

hacer yo adivinar correctamente que la ID es el ID de usuario y no el ID de ¿la moneda? – AxelEckenberger

+0

Ese es el ID del tipo de precio, no relevante para esta pregunta – Marek

+0

No hay necesidad de varias monedas: estamos fijos en una sola moneda pero necesitamos permitir varios tipos de formatos de entrada como se menciona en la pregunta – Marek

Respuesta

16

¡Gracias: El punto es no tratar de obligar a una sola instancia de precio, sino más bien poner en práctica un ModelBinder para 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(); 
Cuestiones relacionadas