Редактор связей модели ASP.NET MVC - Custom, который в состоянии обработать массивы

Я должен реализовать функциональность, чтобы позволить пользователям вводить цену в любую форму, т.е. позволять 10 долларов США, 10$, 10$..., как введено.

Я хотел бы решить это путем реализации пользовательского образцового редактора связей для класса Price.

 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 долларов США".

Мои ModelBinder за Цену вводят до сих пор:

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, которая обрабатывает массивы правильно?

8
задан ire_and_curses 17 March 2010 в 14:22
поделиться

1 ответ

Понятно: суть в том, чтобы не пытаться привязать один экземпляр Price, а реализовать ModelBinder для типа List :

    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();
20
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: