Возможно ли с помощью ASP.NET MVC отображать представление из шаблона, извлеченного из базы данных?

Я пытаюсь создать содержимое электронной почты с использованием разных шаблонов.

Я думаю, что ASP.NET MVC может подойти для этого. Мой контроллер получит необходимые данные для электронной почты и решит, какое представление (шаблон) отображать. (Это больше, чем простое слияние почты, там должны быть условные блоки, foreach и т. д.)

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

Это возможно? Я бы предпочел использовать механизм просмотра WebForms, но, если это невозможно, рассмотрю другие механизмы просмотра. В идеале я хотел бы использовать типизированные представления.


person John Rutherford    schedule 23.09.2009    source источник
comment
Хранение шаблонов в базе данных является легкой частью. Отображение строго типизированной страницы представления ASP.NET MVC в строку внутри действия контроллера может оказаться более сложной задачей.   -  person Darin Dimitrov    schedule 24.09.2009
comment
В итоге я использовал механизм представления NVelocity (nvelocity.codeplex.com) для той же цели.   -  person Darin Dimitrov    schedule 24.09.2009


Ответы (4)


К сожалению, WebForms ViewEngine использует некоторые внутренние классы для компиляции файлов aspx и ascx, поэтому это невозможно. Этот ViewEngine требует, чтобы представления были доступны в виде файлов в папке внутри корня сайта (виртуальная папка также будет работать IIRC).

Существуют другие ViewEngine, которые могут лучше соответствовать вашим целям, в том числе те, которые используют XSLT.

AFAIR можно смешивать несколько ViewEngine в одном приложении, поэтому вы можете использовать механизм WebForms для своих обычных веб-страниц и другой для своих электронных писем.

person Mark Seemann    schedule 23.09.2009
comment
Итак, требует ли WebForms ViewEngine, чтобы представления уже были скомпилированы в приложении? Или он компилирует их во время выполнения? Я имею в виду, возможно ли через отражение получить доступ к этим внутренним классам и скомпилировать представление из содержимого, которое я предоставляю во время выполнения. Я еще не смотрел на внутреннюю работу механизма представления. - person John Rutherford; 24.09.2009
comment
Он компилирует представления во время выполнения. Даже если бы вы могли использовать отражение для их компиляции во время выполнения, это не будет тривиально, так как большая часть этого компилируется из файлов... Хотя это возможно... - person Mark Seemann; 24.09.2009
comment
Я визуализирую представления, сохраненные в базе данных, с помощью поставщиков виртуальных файлов и пользовательского viewEngine из уровня данных с помощью Razor. Razor может работать независимо, но очевидно, что реализация строгая. т.е. без ViewBag - person Piotr Kula; 29.07.2014

Вы действительно можете использовать несколько механизмов просмотра в одном приложении. Фреймворк спросит каждый из движков, способен ли он отображать запрошенное представление. Проверьте MvcContrib на наличие других доступных движков просмотра...

Как указано в предыдущем ответе, WebForms ViewEngine предполагает, что представления (aspx, ascx) физически хранятся в файловой системе, как это делает ASP.NET (хотя в ASP.NET у вас есть что-то вроде VirtualPathProvider), который, как мне кажется, изначально был добавлен в структура для поддержки, например Шейпот).

Если вы хотите создать свой собственный механизм просмотра, вам следует реализовать IViewEngine и добавить механизм просмотра в коллекцию ViewEngines, например. в Application_Start.

person sergevm    schedule 23.09.2009

У Фила Хаака есть отличная статья о чем-то подобном. .

Я думаю, что это может быть адаптировано к вашим потребностям.

Доброта,

Дэн

person Daniel Elliott    schedule 24.09.2009

Вы должны создать свой viewengine и свой buildmanager. Ваш механизм просмотра может просто получить часть aspx из базы данных и вызвать механизм веб-формы. Нелегко, но выполнимо, в основном это зависит от того, насколько сильно вам это нужно и как это вознаградит вас хорошей рентабельностью инвестиций.

person Kronos    schedule 08.11.2010