Форма MVC3 отправляет один вход в Action с параметром списка - PullRequest
1 голос
/ 24 декабря 2011

У меня есть сторонний элемент управления, который использует одно скрытое поле ввода для хранения списка целых чисел.Этот элемент управления используется по всему сайту в многочисленных формах.

Отправленное значение (как показано в Fiddler):

items=1,35,346,547

Действие контроллера выглядит следующим образом:

public ActionResults SomeAction(IEnumerable<int> items) {...}

Как и ожидалось, DefaultModelBinder не может проанализировать список целых чисел.Учитывая, что у меня есть возможность изменить формат входного значения, есть ли такой формат, который позволил бы привязке модели по умолчанию проанализировать это для меня?

Я мог бы легко изменить действие, чтобы иметь строковый параметри сам справлюсь с разбором, однако я бы хотел, чтобы связыватель модели сделал это для меня.Я также мог бы перехватить отправку формы и очистить / изменить тип данных / данных на JSON (или другой формат), однако я действительно хотел бы избежать такого подхода.Другим вариантом может быть создание пользовательского связующего для модели, но это может показаться излишним.

Рекомендации?

1 Ответ

2 голосов
/ 24 декабря 2011

Описание

Нет, механизм связывания по умолчанию не может этого сделать.Вы можете создать собственный связыватель модели, который обрабатывает это.Предполагая, что ваше поле ввода имеет имя items мой образец должен работать, если не изменить его на правильное имя.

Образец

public class MyCustomModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        List<int> result = new List<int>();

        var value = bindingContext.ValueProvider.GetValue("items").AttemptedValue;

        foreach (string i in value.Split(",".ToCharArray()))
        {
            int a;
            if (Int32.TryParse(i, out a))
                result.Add(a);
        }

        return result;
    }
}

public ActionResult SomeAction([ModelBinder(typeof(MyCustomModelBinder))] List<int> list)

Дополнительная информация

Обновление

Вы можете зарегистрировать свой пользовательский связыватель модели в global.asax

  ModelBinders.Binders.Add(typeof(List<int>), new MyCustomModelBinder());

, но имейте в виду, что это всегда будет пытаться связать, если у вас есть List<int> вваш метод действия.

Согласно вашему комментарию: на данный момент нет способа, позволяющего сказать «Связующее звено модели по умолчанию», потому что он пытается связать свойства и не знает, когдаВы хотите связать List<int>, а когда нет.

Вы можете увидеть источник DefaultModelBinder здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...