Парсер RazorTemplateEngine создает необычное синтаксическое дерево

Я искал способ повторно использовать представления MVC Razor в качестве шаблонов javascript для рендеринга на стороне клиента и нашел эту библиотеку (шаблон клиента Razor), который анализирует представления Razor в функции javascript.

Он не работает с движком Razor версии 2, и небольшое раскопки показывают, что это связано с тем, что синтаксическое дерево движка Razor было переработано. Пытаясь что-то изменить, я обнаружил некоторые странные результаты синтаксического анализатора RazorViewEngine.

У меня очень простой вид, например:

@model Justis4.Models.EntityModel
<div>
    @Model.PropertyOne
    @Model.PropertyTwo
</div>

Библиотека шаблонов клиента Razor начинается с:

var host = new RazorEngineHost(newCSharpRazorCodeLanguage());
var engine = new RazorTemplateEngine(host);
var parserResults = engine.ParseTemplate(razorTemplate);  //from string reader
var doc = parserResults.Document;

а затем уходит, чтобы начать синтаксический анализ результирующего синтаксического дерева в функцию javascript.

Когда я отлаживаю дерево синтаксиса, я вижу некоторые странные вещи. Насколько я понимаю, движок Razor разбивает представление на "блоки" и "промежутки" разных типов. Но, как и на картинке, объявление модели вверху было проанализировано как разметка, а не как код. Бывают похожие странности, и в итоге остальная часть парсинга на javascript не проходит.

введите здесь описание изображения


person user888734    schedule 08.01.2013    source источник


Ответы (1)


Стандартный синтаксический анализатор бритвы не распознает ключевое слово @model. Ключевое слово @model взято из MvcCSharpRazorCodeParser. в сборке System.Web.Mvc.

Основная функциональность для этого исходит от SetModelTypeCodeGenerator. Этот класс использует базовый класс Razor Engine, SetBaseTypeCodeGenerator, чтобы изменить базовый тип для представления бритвы с WebViewPage по умолчанию на WebViewPage<Model>.

Решения

Вместо этого используйте ключевое слово @inherits, например. @inherits WebViewPage<EntityModel>.

Или добавьте ссылку на System.Web.Mvc и с помощью пользовательского языка измените синтаксический анализатор кода на MvcCSharpRazorCodeParser. Вам нужно будет установить для свойства RazorEngine.DefaultBaseClass неуниверсальную версию базового класса, который вы собираетесь использовать, например. для WebViewPage<T> вы должны установить engine.DefaultBaseClass = "System.Web.Mvc.WebViewPage".

class MvcCSharpRazorCodeLanguage : CSharpRazorCodeLanguage
{
    public override ParserBase CreateCodeParser()
    {
        return new MvcCSharpRazorCodeParser();
    }
}
person Chris Chilvers    schedule 08.01.2013