2013-02-21 2 views
0

Я создаю многошаговый процесс в стиле мастера в веб-приложении ASP.NET MVC 4. Я использую TempData для зависания информации с предыдущих шагов, потому что мастер не является строго линейным - выбор пользователя на первой странице фактически приводит к тому, что они видят один из трех вариантов для третьей страницы. Я достигаю этого, используя свой выбор, чтобы присвоить одному из трех производных классов свойству базового класса на viewmodel для этой третьей страницы. Затем сама страница использует настраиваемое связующее устройство, которое позволяет мне использовать @Html.EditorFor(m => m.BaseContainer) и отображать на нем правильный шаблон для заполнения пользователем. Моя проблема заключается в том, что при обращении к третьей странице, метод контроллера, конечно, class object, что означает, что когда я сохраняю его в TempData, он сохраняет только свойства базового класса.Передача производного класса через свойство базового класса на контроллере

Я мог бы сделать серию проверок вдоль линий if (viewModel.BaseContainer is DerivedClass1), но это похоже на взлома. Весь смысл абстракции в использовании базового класса заключается в том, что контроллеру не нужно знать, какой он находится в этой точке. Есть ли более элегантный способ сохранить объект, не теряя свойства производного класса?

+0

У вас есть код, который поможет вашему описанию – CR41G14

ответ

0

Мы занимались той же проблемой несколько месяцев назад. Мы решили это, используя меньшую модель представления для каждого шага мастера, а затем, при успешной проверке, скопировали значения в большую модель представления (содержащую свойства для всего в мастере). Затем мы сохранили эту модель большого вида в TempData и перешли к следующему шагу.

Если вы добавляете новые свойства при получении базового класса, то расширяете его интерфейс, вы можете создавать дополнительные интерфейсы для новых свойств в каждом производном классе, но это не похоже на простое решение ,

+0

Я делаю что-то подобное. Каждый шаг процесса имеет свою собственную модель просмотра, и есть объект, который описывает весь запрос, который создает мастер. После каждого шага contrller извлекает эту модель из TempData, извлекает необходимые бит из POST и добавляет их к объекту, а затем помещает обратно в TempData. Моя проблема заключается в том, что на этом этапе требуемые биты могут быть доступны только их базовому классу. Я могу добавить их к объекту без проблем (он имеет одно и то же свойство базового класса), но они, похоже, не сохраняют свои уникальные свойства - только базовые классы. – anaximander

+0

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

Смежные вопросы