Обновление (21 сентября 2016 г.). Благодаря Digbyswift для комментариев, что это решение по-прежнему работает и в MVC5.
Обновление (30 апреля 2012 г.). Примечание для людей, которые спотыкаются об этом вопросе от поисков и т.д. - принятый ответ - это не то, как я это сделал, но я оставил его принятым, потому что он, возможно, сработал в некоторых случаях. Мой собственный ответ содержит окончательное решение, которое я использовал, которое можно использовать повторно и будет применяться к любому проекту.
Он также подтвердил работу в v3 и v4 структуры MVC.
У меня есть следующий тип модели (имена класса и его свойства были изменены для защиты их идентификаторов):
public class MyExampleModel
{
public string[] LongPropertyName { get; set; }
}
Затем это свойство привязано к набору ( > 150) флажков, где каждое одно имя ввода, конечно, LongPropertyName
.
Форма отправляет URL-адрес с HTTP GET и говорит, что пользователь выбирает три из этих флажков - URL-адрес будет содержать строку запроса ?LongPropertyName=a&LongPropertyName=b&LongPropertyName=c
Большая проблема заключается в том, что если я выберем все (или даже чуть более половины!) флажков, я превышу максимальную длину строки запроса, установленную фильтром запросов в IIS!
Я не хочу распространять это - так что я хочу, чтобы обрезать эту строку запроса (я знаю, что могу просто переключиться на POST), но даже в этом случае я все же хочу свести к минимуму количество пуха в данных, отправленных клиент).
То, что я хочу сделать, это привязать LongPropertyName
к простому "L", чтобы строка запроса стала ?L=a&L=b&L=c
, но без изменения имени свойства в коде.
В рассматриваемом типе уже есть настраиваемое связующее устройство (исходящее из DefaultModelBinder), но оно привязано к его базовому классу, поэтому я не хочу размещать там код для производного класса. В настоящее время вся привязка свойств выполняется стандартной логикой DefaultModelBinder, которая, как я знаю, использует TypeDescriptors и дескрипторы свойств и т.д. Из System.ComponentModel.
Я как бы надеялся, что может быть атрибут, который я могу применить к свойству, чтобы сделать эту работу - есть ли? Или я должен смотреть на реализацию ICustomTypeDescriptor
?