ASP.NET MVC - Пользовательская модель binder, способная обрабатывать массивы
-
23-09-2019 - |
Вопрос
Мне нужно реализовать функциональность, позволяющую пользователям вводить цену в любой форме, т.е.разрешить 10 долларов США, 10 долларов США, 10 долларов США,...в качестве входных данных.
Я хотел бы решить эту проблему, внедрив пользовательскую модель binder для ценового класса.
class Price { decimal Value; int ID; }
Форма содержит массив или Цены в виде ключей
keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
ViewModel содержит свойство Prices (Цены):
public List<Price> Prices { get; set; }
Привязка модели по умолчанию работает нормально до тех пор, пока пользователь вводит строку, преобразуемую в десятичную дробь, во вводимое значение.Я хотел бы разрешить ввод данных типа "100 долларов США".
Мой модельбиндер для ценового типа на данный момент:
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;
}
Как мне реализовать пользовательскую модель Binder, которая правильно обрабатывает массивы?
Решение
Понял это:Смысл в том, чтобы не пытаться привязать один экземпляр Price, а скорее реализовать ModelBinder для 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();