Возвращение обработанного бритвой Javascript как ViewResult из контроллера - PullRequest
4 голосов
/ 07 марта 2011

Я успешно создал веб-приложение mvc / razor, которое возвращает файлы css, которые были проанализированы бритвой. Каждый раз, когда есть фоновое изображение, у меня есть фрагмент бритвы, который записывает префикс URL в имя файла изображения. CSS теперь выглядит так:

body { background-image: url(@LookupUrl.Image("background.gif")); }

Css-файлы теперь работают нормально, и я перешел к попытке заставить файлы javascript .js функционировать таким же образом, но они не играют в мяч.

Код идентичен коду CSS и он успешно находит файл .js, но бритва, кажется, анализирует его по-другому. Вот пример файла js:

function testFunction() { alert('test function hit!'); }
testFunction();

Razor, кажется, думает, что это код, который он должен скомпилировать, и выдает ошибку:

Compiler Error Message: JS1135: Variable 'alert' has not been declared

    > Source Error:
    > 
    > Line 1:  function testFunction() {
    > Line 2:      alert('test function
    > hit!'); Line 3:  } Line 4: 
    > testFunction();

После переименования того же файла в .css он работает нормально.

Есть ли способ заставить бритву работать с файлами .js так же, как и для .css?

Вот как я зарегистрировал обработчики файлов для бритвы:

RazorCodeLanguage.Languages.Add("js", new CSharpRazorCodeLanguage());
RazorCodeLanguage.Languages.Add("css", new CSharpRazorCodeLanguage());

WebPageHttpHandler.RegisterExtension(".js");
WebPageHttpHandler.RegisterExtension(".css");

Поставщик сборки зарегистрирован в PreApplicationStart с помощью метода, описанного Haacked в его сообщении в блоге .

Нужно ли удалять обработчик, который mvc добавляет для файлов .js?

ОБНОВЛЕНИЕ 2 дня

Хотя я начал работать так, как хотел, я не рекомендовал бы этот метод другим. Использование Razor для синтаксического анализа css / javascript некорректно без использования - простота использования бритвы с помощью @ ampersand все портит. Рассмотрим CSS3 @ font-face. Бритва нажимает на @ и думает, что должна использовать его как функцию. То же самое может случиться с javascript, и произошло с Jquery 1.5.1.

Вместо этого я, вероятно, вернусь к веб-формам aspx для динамического css / javascript, где меньше шансов появления блоков кода <%%> естественным образом.

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

Я не мог понять, почему CSS работал, в то время как JS не работал, особенно после того, как JS-код copy + paste работал внутри CSS-файла.

Я использовал диалог поиска / замены в Visual Studio в источнике System.Web.WebPages.Razor для поиска строки «.js» в проекте.Там не было ничего полезного, поэтому я пошел в проект System.Web.WebPages.Он обнаружил совпадение в System.Web.WebPages.Util, который является статическим классом с несколькими вспомогательными методами.

Одним из этих методов является EnsureValidPageType, и внутри есть блок try / catch.Внутри блока «catch» есть комментарий:

// If the path uses an extension registered with codedom, such as Foo.js,
// then an unfriendly compilation error might get thrown by the underlying compiler.
// Check if this is the case and throw a simpler error.

Это заставило меня поверить, что у .js есть специальный встроенный обработчик.

Я немного погуглил, не смог 'ничего не нашел, затем заглянул в файл web.config, который находится в \ Windows \ Microsoft.NET \ Framework64 {версия} \ Config.

В нем есть сопоставление buildProvider для расширения .js на

System.Web.Compilation.ForceCopyBuildProvider

После удаления этого buildprovider из веб-файла web.config файлы .js компилируются и работают как надо!

Я все еще не совсем уверен, для чего предназначен или предназначен ForceCopyBuildProvider, но мне интересно,это для визуальной студии.В различных расширениях зарегистрированы разные провайдеры сборки Copy / Ignore.

Еще раз прошу прощения за ответ на мой собственный вопрос, но я надеюсь, что исчерпывающий (вафельный) ответ может помочь другим.

2 голосов
/ 07 марта 2011

Вы можете попробовать использовать специальный узел <text>, чтобы указать синтаксическому анализатору Razor обрабатывать содержимое буквально:

<text>
    function testFunction() { alert('test function hit!'); }
    testFunction();
</text>
1 голос
/ 07 марта 2011

Парсер Razor по умолчанию использует HtmlMarkupParser для обработки компонентов разметки вашего шаблона.В настоящее время нет никаких альтернативных синтаксических анализаторов, которые поддерживают другие языки разметки (которые вы должны будете рассматривать как язык кода javascript).Если бы вы создали новый синтаксический анализатор разметки, я бы подумал, что было бы довольно сложно разделить код и разметку (то есть C # и Javascript).

Что вы могли бы сделать, это использовать перенос <text></text>элементы для принудительного применения синтаксического анализатора переключаются в режим разметки при достижении этого раздела шаблона, например,

<text>function testFunction() { alert('test function hit!'); }</text>

Это не красиво, но это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...