MVC3 Связывание пользовательской коллекции - PullRequest
2 голосов
/ 06 января 2012

Согласно: MVC3 Связывание перемещаемого списка модели с ViewModel с пользовательским EditorTemplate и частичным представлением

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

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

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

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

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

Обновление:

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

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

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

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

1 Ответ

1 голос
/ 15 февраля 2012

Посмотрите на источник для 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);

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

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

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