2013-11-29 5 views
3

Я соединяю некоторые частичные представления вместе, и мне нужен способ использовать разные модели в моем вызове RenderPartial(). Большинство ответов на состояние SO для приведения к типу модели, но это не будет известно во время компиляции.Передача разных моделей RenderPartial()

Веб-сайт имеет различные категории, такие как Автомобили, Самолеты, Вертолеты и Лодки. Когда пользователь нажимает на ссылку «Автомобили», на странице «Индекс автомобильного контроллера» отображаются все автомобили в симпатичной таблице. То же самое для Planes и т. Д. Все таблицы идентичны, поэтому я хочу использовать частичный вид для повторного использования кода.

@model IEnumerable<MyNamespace.Entities.Car> 
@{Html.RenderPartial("Partials/_TableList", Model);} 

Внутри _TableList.cshtml - мой симпатичный стол. Поэтому теперь я хочу вызвать еще одно частичное представление, которое отображает список моделей типа «Автомобиль» и выводит головку и тело таблицы. Точно так же, если пользователь нажал «Планы», это будет загружать частичное, которое принимает список моделей Plane.

<table class="table prettyTable"> 
@{Html.RenderPartial((string)ViewBag.PartialToLoad, Model);} 
</table> 

И _CarList.cshtml

@model IEnumerable<MyNamespace.Entities.Car> 
<thead>...</thead> 
<tbody> 
@foreach (var item in Model) 
{ ... } 
</tbody> 

Можно ли это сделать? Или я должен положить модель в ViewBag и передать ее?

EDIT: Благодаря @Adas, я был в состоянии решить эту проблему путем добавления

@model IEnumerable<dynamic> 

к началу _TableList.cshtml. Теперь, когда я вызываю RenderPartial(), он не жалуется, что «методы расширения не могут быть динамически отправлены». Это теперь работает отлично:

<table class="table prettyTable"> 
@{Html.RenderPartial((string)ViewBag.PartialToLoad, Model);} 
</table> 

ДАЛЕЕ EDIT: Я обнаружил, что, хотя выше работал с IEnumerable это было не с @model динамичным. Я обнаружил, что можно вызвать RenderPartial таким образом, который работает в этом случае.

@{RenderPartialExtensions.RenderPartial(Html, (string)ViewBag.PartialToLoad, Model);} 

где PartialToLoad в ViewBag устанавливается в контроллер.

+1

Почему бы не использовать полиморфизм для вашей модели? –

ответ

2

У вас есть 3 варианта здесь:

  1. использования динамической модели, т.е. @model IEnumerable<dynamic>
  2. Реализовать некоторый общий интерфейс на вашей модели и использовать его @model IEnumerable<IYourCommonInterface>
  3. унаследует все ваши модели из некоторого общего класса, как Эмре nevayeshirazi прокомментировал, @model IEnumerable<YourBaseClass>.

Не имеет значения, передадите ли вы модель, например Model, или вы поместите ее в ViewBag, для доступа к общим методам вам понадобится один из вышеперечисленных методов.

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