Я соединяю некоторые частичные представления вместе, и мне нужен способ использовать разные модели в моем вызове 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 устанавливается в контроллер.
Почему бы не использовать полиморфизм для вашей модели? –