RazorEngine (вне MVC) — Возможно ли регистрировать шаблоны без явного указания типа модели?

#.net #razor

#.net #razor

Вопрос:

Возможно ли регистрировать шаблоны без указания типа модели?

В настоящее время это работает следующим образом (взято из: documentation):

 //Code to get template string from file xxx.cshtml into template variable
Razor.Compile(template, typeof(SomeModel), "complex");
  

Однако я хотел бы предварительно скомпилировать шаблоны, взяв определение типа модели из директивы @model or @inherits в представлении. Возможно ли это?

Комментарии:

1. CompileWithAnonymous Помогает?

2. @Russ: Нет typeof(dynamic) . Это просто object .

3. Действительно, я имел в виду замену части typeof тоже.

4. @Russ C: В настоящее время я внедряю его в Webforms CMS. Все это работает и способно прекрасно заменять пользовательские элементы управления. Однако здесь и там нужно немного подстричься, прежде чем я выпущу его как модуль с открытым исходным кодом. Я буду держать вас в курсе.

5. @SLaks, хорошо, не сама разметка Razor, но было бы неверно говорить, что она не используется; ViewBag используется часто и является динамическим.

Ответ №1:

Razor.Compile не требует указания типа модели при компиляции.

 public class ActualType { public string Firstname {get;set;}}

Razor.Compile("@Model.Firstname", "outputname");
Razor.Run<ActualType>(model, "outputname");
  

Должно работать для вас просто отлично.

@model Объявление пока недоступно. В настоящее время для этого есть исправление на странице списка исправлений ( http://razorengine.codeplex.com/SourceControl/list/patches ), однако это только добавляет поддержку во время разработки, а не во время выполнения. Текущая причина этого заключается в том, что MVC RazorEngine уже выполняет это, и мы не хотели путаницы относительно того, совпадает ли этот движок razor с реализацией MVC razor (многие люди так думают)

Мы рассматриваем возможность реализации этого для версии 2.2, когда у нас обоих будет время поработать над этим.

Если модель, которую вы передаете, соответствует требуемым параметрам, используемым шаблоном, возможно, все в порядке.

На самом деле не должно быть слишком сложно изменить исправление, чтобы заставить шаблон использовать @model объявление как есть template<t> . Возможно, я мог бы поработать над этим сегодня вечером, если это серьезное требование. Мне любопытно, почему вы не хотите включать это в объявление компиляции, если вы не беспокоитесь об изменении моделей или вы не знаете модель заранее…но, в конце концов, вы всегда знаете тип, прежде чем передавать его.

Комментарии:

1. Наконец-то запустил это! «Невозможно привести объект типа ‘RazorEngine. Сборник. RazorDynamicObject’для ввода’ некоторого пространства. Выдается SomeModel’.», если я указываю @inherits директиву. Если я опущу объявление, оно будет работать нормально! Однако для Visual Studio требуется поддержка intellisense @inherits или @model

Ответ №2:

Глядя на исходный код, да.

modelType Параметр задает тип по умолчанию, и сам по себе по умолчанию имеет значение dynamic , если он опущен.

Однако, если в представлении явно указан его базовый тип, это должно переопределить его.

Обратите внимание, что я не пробовал это; я просто делаю вывод из источника.

Комментарии:

1. Мне не нужен универсальный шаблон. Дело в том, что я не хочу указывать тип модели дважды. Это уже определено (как строка) в верхней части шаблона, зачем беспокоиться о том, чтобы указывать это снова при вызове функции компиляции?

2. @Ropstah: Я не уверен. Прочитайте исходный код или попробуйте сами; я могу ошибаться. (Я еще не использовал RazorEngine)

3. При дальнейшем рассмотрении кажется, что ModelType параметр просто указывает базовый тип по умолчанию, и вы все равно получите универсальный тип, если так указано в представлении.