Как вставить код 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>