Как вставить код Razor С# в файл .js?

Необходимо внедрить блок javascript с

<script type='text/javascript'>
  ...
</script>

Но код Razor не будет компилироваться в файле .js, включенном в файл .cshtml.

Как это сделать? Или есть какой-либо другой элегантный способ получить аналогичный эффект?

Спасибо.

Ответ 1

Когда я сталкиваюсь с этой проблемой, иногда я предоставляю функцию в файле .js, который доступен в файле .cshtml...

// someFile.js
var myFunction = function(options){
    // do stuff with options
};

// razorFile.cshtml
<script>
    window.myFunction = new myFunction(@model.Stuff);
    // If you need a whole model serialized then use...
    window.myFunction = new myFunction(@Html.Raw(Json.Encode(model)));
</script>

Не обязательно параметр BEST, но он будет делать, если вам нужно это сделать...

Другая вещь, которую вы могли бы попробовать, - это использовать атрибуты данных для ваших элементов html, например, как jQuery.validate.unobtrusive делает...

//someFile.js
var options = $("#stuff").data('stuff');

// razorFile.cshtml
<input type="hidden" id="stuff" data-stuff="@model.Stuff" />

Ответ 2

Вы не можете. Вы также не должны пытаться. Держите их отдельно. Это происходит по-другому, но вы должны заглянуть в ненавязчивый JavaScript. Эта схема проектирования, применяемая во всем проекте, является отличной идеей.

Ответ 3

Здесь приведен пример веб-страницы Razor (а не MVC-представление, хотя это было бы похоже), который будет обслуживать Javascript. Конечно, нетипично динамически писать файлы Javascript, но здесь образец тем не менее. Я использовал это однажды в случае, когда я хотел предоставить данные JSON и некоторые другие вещи, которые дорого стоили для вычисления и редко менялись - поэтому браузер мог включить его и кэшировать как обычный JS файл. Хитрость здесь заключается в том, чтобы установить Response.ContentType, а затем использовать что-то вроде тегов Razor <text> для вашего Javascript.

@{
Response.ContentType = "text/javascript";
Response.Cache.SetLastModified(System.Diagnostics.Process.GetCurrentProcess().StartTime);
Response.Cache.SetExpires(System.DateTime.Now.Date.AddHours(28));
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
<text>
var someJavaScriptData = @someSortOfObjectConvertedToJSON;
function something(whatever){
}
</text>
}

Затем вы можете включить его в свой другой файл Razor:

<script src="MyRazorJavascriptFile.cshtml"></script>

Ответ 4

Хотя я согласен с тем, что вы должны дважды подумать об использовании Razor внутри ваших файлов Javascript, есть пакет Nuget, который может вам помочь. Он назывался RazorJS.

У автора пакета есть сообщение в блоге об этом, что объясняет, как его использовать.

Ответ 5

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

У меня возникло соблазн найти способ оценки выражений бритвы в файле java script. Я хотел бы добавить обработчик события jQuery для отправки с определенным классом, который находится на многих страницах. Это должно быть сделано в обработчике события готовности документа jQuery. Это событие click вызовет вызов ajax.

URL-адрес должен быть относительным, а не абсолютным, если приложение живет ниже корневого уровня. Итак, я хотел использовать что-то вроде

$(document).ready(function () {
    $('input[type="submit"].checkit)').click(function (e) {
        $.ajax({
            type: 'POST',
            url: '@Url.Content("~/checkit")', //Razor expression here
            dataType: 'json',
            success: function (data) {
                if (!data) {
                    e.preventDefault();
                    handleResponse(data);
                }
            },
            data: null,
            async: false
        });
    });
});

Я решил это, обернув код в функции Checkit и переведя вызов в представление макета:

        $(document).ready(function () {
            Checkit('@Url.Content("~/checkit")');
        });

Большинство javascript-кода все еще находятся в файле javascript.

Ответ 6

А как насчет включения .cshtml, который содержит только js?

.csthml parent

@RenderPage("_scripts.cshtml")

_scripts.cshtml, который содержит js

<script type="text/javascript">
alert('@Datetime.ToString()');
</script>