2012-01-06 2 views
2

По: MVC3 Model binding pagedlist to ViewModel with custom EditorTemplate and Partial ViewMVC3 Связывание пользовательской коллекции

см.выше вопрос для фрагментов кода

Проблема, которую я имею в настоящее время окружает связывании пользовательской коллекции IPagedList. Связующее устройство модели пытается привязать значения к свойству ViewModel, но не может создать экземпляр интерфейса (никаких сюрпризов нет).

Итак, как я могу привязать значения к моей модели представления, создавая экземпляр конкретного класса PagedList, когда значения привязаны? Как я понимаю, IEnumerable binder делает это для List или аналогичного производного, так как я могу это сделать для своего пользовательского класса/интерфейса?

Нужно ли мне для этого накладывать заказную модель? Если так, то любая информация или советы на этом коде замечательны!

Любая помощь очень благодарна.

Update:

Изменение ViewModel включить переопределен конструктор по умолчанию, который инициализирует интерфейс, как так:

public class RequestCreateViewModel : ViewModelBase 
{ 
    public IPagedList<CreateRequestModel> PagedList { get; set; } 

    public RequestCreateVieWModel() 
    { 
     PagedList = new PagedList<RequestCreateModel>(new List<RequestCreateModel>(), new PagingOptions()); 
    } 

.. появляется, чтобы модель Связыватель по умолчанию работать в соответствии с моим комментарием. Но это не похоже на отличное решение, главным образом потому, что им нужно вывести новые параметры объекта для объекта PagedList каждый раз при создании ViewModel. Неужели я беспокоюсь?

+2

Я бы заглянул в пользовательские привязки моделей. Сначала запугивать, но не так уж плохо. Вы можете многое сделать с этой функцией. Имейте в виду, что есть два разных способа сделать это. Наследование с DefaultModelBinder и создание собственного связующего, которое просто реализует IModelBinder. –

+0

Кто-нибудь получил больше информации о том, что сказал Джефф? Спасибо – M05Pr1mty

+0

Добавив конструктор к объекту ViewModel с инициализацией для интерфейса, связующее по умолчанию выполняет свою работу и связывается с правильным наименованием, конечно. Вдохновение пришло из: http://stackoverflow.com/questions/5749775/implementing-asp-net-mvc-3-interface-model-binding-with-viewmodel Но это не позволяет создать настраиваемое связующее устройство для этого ... Так что мой вопрос по-прежнему стоит, хорошая ли это идея или нет? – M05Pr1mty

ответ

1

Посмотрите на источник для DefaultModelBinder.cs в проекте ASP.NET MVC на Codeplex. Комментарий в BindComplexModel резюмирует все это:

// special-case IDictionary<,> and ICollection<> 

Если каркасные особых случаи MVC тех типам, то вам нужно будет создать пользовательскую модель связующий для вашего типа. Но решение, которое вы предлагаете, работает ... почему? В вашем типе не используются специальные чехлы ICollection или IDictionary. Путь по умолчанию по умолчанию вызывает конструктор по умолчанию для типа модели:

// fallback to the type's default constructor 
return Activator.CreateInstance(typeToCreate); 

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

Вы просили больше идей. Как насчет того, чтобы оставить то, что у вас есть. Оно работает. Написание настраиваемого связующего будет просто работать на этом этапе. Больше кода для выполнения того же самого.

+0

Согласен, приветствует ответ. Отметьте это как ответ, поскольку я не меняю реализацию. Приветствия. – M05Pr1mty