ASP.NET MVC - Modelo Custom Binder capaz de processar matrizes
-
23-09-2019 - |
Pergunta
Preciso implementar uma funcionalidade para permitir que os usuários digitem o preço de qualquer forma, ou seja, para permitir 10 USD, 10 $, US $ 10, ... como entrada.
Gostaria de resolver isso implementando um fichário personalizado para a aula de preços.
class Price { decimal Value; int ID; }
O formulário contém uma matriz ou preços como chaves
keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
O ViewModel contém uma propriedade de preços:
public List<Price> Prices { get; set; }
O encadernador do modelo padrão funciona bem desde que o usuário insira uma string decimal-conversível na entrada do valor. Eu gostaria de permitir insumos como "100 USD".
Meu Modelbinder para o tipo de preço até agora:
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;
}
Como implemento um fichário de modelo personalizado que lida com as matrizes corretamente?
Solução
Consegui: o objetivo é não tentar vincular uma única instância de preço, mas implementar um Modelbinder para List<Price>
modelo:
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();