MVC - динамическая загрузка частичных представлений - PullRequest
2 голосов
/ 10 августа 2009

Я пытаюсь динамически загрузить частичные представления в представление, передавая список путей для требуемых частичных представлений и затем вызывая RenderPartial для каждого. Это, кажется, делает трюк. Проблема возникает, когда я пытаюсь передать модель в частичное представление. Поскольку я загружаю их динамически, я точно не знаю, какую модель передать для этого конкретного частичного представления. Я не хочу заполнять каждый возможный объект, и я рассматриваю возможность использования отражения с поиском конфигурации для каждого частичного представления для динамической загрузки модели. Я также рассматривал возможность добавления ActionFilter, который автоматически заполнил бы нужные мне значения модели, но даже эта реализация должна была бы использовать Reflection. У кого-нибудь есть другие предложения?

Одна вещь, которую мне не хватает в обычных пользовательских элементах управления ASP.NET, которые я не вижу в MVC. Пользовательские элементы управления инкапсулировали свою собственную логику для извлечения данных, тогда как в MVC главный контроллер должен знать об этом. Это означает, что если бы я использовал частичное представление для другого контроллера, этот контроллер также должен был бы знать, как получить модель для этого частичного представления. Я что-то здесь упускаю? Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 августа 2009

Если вам нужна возможность делать то, что вы описываете, вам может быть интересно прочитать о 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); %>

Тогда частичное представление строго типизировано и знает, что делать с моделью строго типа.

1 голос
/ 10 августа 2009

Создание вспомогательной функции, которая имеет логику и возвращает Partials в виде строки , может привести к тому же самому. И будет иметь больше портативности, чем виртуальные функции, предложенные RichardOD.

...