#.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
параметр просто указывает базовый тип по умолчанию, и вы все равно получите универсальный тип, если так указано в представлении.