MVC - динамическая загрузка частичных представлений
Я пытаюсь динамически загрузить частичные представления в представление, передавая список путей для частичных представлений, которые я хочу, и затем вызывая RenderPartial для каждого. Это, кажется, делает трюк. Проблема возникает, когда я пытаюсь передать модель в частичное представление. Поскольку я загружаю их динамически, я точно не знаю, какую модель передать для этого конкретного частичного представления. Я не хочу заполнять каждый возможный объект, и я рассматриваю возможность использования отражения с поиском конфигурации для каждого частичного представления для динамической загрузки модели. Я также рассматривал возможность добавления ActionFilter, который автоматически заполнил бы правильные значения модели для меня, но даже эта реализация должна была бы использовать Reflection. У кого-нибудь есть другие предложения?
Одна вещь, которую мне не хватает в обычных пользовательских элементах управления ASP.NET, которые я не вижу в MVC. Пользовательские элементы управления инкапсулировали свою собственную логику для извлечения данных, тогда как в MVC главный контроллер должен знать об этом. Это означает, что если бы я использовал частичное представление для другого контроллера, этот контроллер также должен был бы знать, как получить модель для этого частичного представления. Я что-то здесь упускаю? Благодарю.
2 ответа
Если вам нужна возможность делать то, что вы описываете, вам может быть интересно прочитать о Html.RenderAction (). Это полезно во многих обстоятельствах, но не является "чистым" MVC (возможно, прагматичным MVC).
У меня похожая ситуация с вами, когда я использую частичные представления для загрузки разных экранов поиска (кнопки отправки поиска одинаковы), только поля формы различны.
Я делаю это следующим образом. В обычном контроллере базового класса у меня есть параметр общего типа, который я передаю объекту модели представления (SearchObject имеет тип объекта).
public abstract class SampleController<T> : Controller where T : new()
public virtual ActionResult SearchForDocuments()
{
searchModel.SearchObject = // Create type of T;
// Some more code
return View("SomeView", searchModel);
}
Затем у меня есть строго типизированное представление, которое передает SearchObject в частичное представление.
<% Html.RenderPartial(@"../Search/SearchCriteriaTemplates/" + /*Specific view name*/, Model.SearchObject); %>
Частичное представление тогда строго типизировано и знает, что делать со строго типом Model.
Создание вспомогательной функции, которая имеет логику и возвращает Partials в виде строки, может привести к тому же результату. И будет иметь больше мобильности, чем виртуальные функции, предложенные RichardOD.