Разделение JavaScript в представлениях бритвы cshtml - PullRequest
7 голосов
/ 13 марта 2012

Я новичок в ASP.NET/MVC3 и пытаюсь выяснить, как отделить мой JavaScript (который содержит C #) от остального HTML.

Если я вставлю их в.JS-файлы и вставьте их с тегом script, после чего аспект C # перестанет работать.Каков наилучший способ разделения вашего кода JavaScript, который также содержит код C # в бритве MVC 3?

Спасибо.

Ответы [ 6 ]

10 голосов
/ 13 марта 2012

По многим причинам вам лучше поместить большинство, если не все ваши JS, в отдельные файлы JS (чтобы вы могли воспользоваться преимуществами повторного использования, минимизации, оптимизации браузера, сетей доставки контента и т. Д.)

Для считывания результата кода бритвы на стороне сервера в файлы JS используйте один из следующих методов:

1) Поместите свой бритвенный код в переменную javascript в представлении (не проверенный код)

<script type="text/javascript">
  if(!MyGlobalVariables){
     MyGlobalVariables = {};
  }
  MyGlobalVariables.IndexUrl = "@Url.Action("Index")";
</script>

2) Используйте пользовательский атрибут (предпочтительно с префиксом данных - как предложено в HTML 5 spec ). См. Соответствующее обсуждение здесь: Можно ли добавить пользовательский атрибут в тег HTML?

<div data-index-url="@Url.Action("Index")"></div>

Затем используйте $ (this) .attr ("data-index-url") в jQuery для доступа к визуализированной разметке бритвы.

3) Поместите C # в скрытые поля ввода на вашем виде и прочитайте скрытый ввод в вашем файле JS.

<input id="indexUrl" type="hidden" value="@Url.Action("Index")" />

Чтобы прочитать это в jQuery, вы должны использовать $ ("# indexUrl"). Val ()

1 голос
/ 15 марта 2012

Вместо этого сделайте что-то подобное на странице просмотра:

var options = {
    parameter1 : '@(SomeC#Value)',
    parameter2 : '@(SomeC#Value)',
    parameter3 : '@(SomeC#Value)',
}

, затем вызовите что-то вроде:

myJavascriptObject.init(options);

и пусть Javascript использует переданные параметры для управления потокоми т. д.

1 голос
/ 13 марта 2012

Код Javascript должен , а не содержать любой динамически сгенерированный код.Если вам нужно загрузить определенные параметры конфигурации, вы должны использовать один встроенный тег сценария, который определяет переменные.Другие параметры загружаются в файл конфигурации json, который генерируется динамически, или основываются на содержимом dom в зависимости от конкретной динамической информации, которая вам нужна.(Я бы сказал, Ajax - самый распространенный способ, хотя это зависит от вашей ситуации).В любом случае, идея заключается в том, что файлы javascript и css всегда статичны.

0 голосов
/ 08 августа 2013

Мы конвертируем наши объекты C # в Json с расширением на объекте и JavaScriptSerializer:

public static string ToJson(this object item)
    {
        return new JavaScriptSerializer().Serialize(item);
    }

Затем мы отправляем его в переменную (или, в нашем случае, передаем его конструктору контроллера JavaScript)

0 голосов
/ 13 марта 2012

Как уже говорили другие, запись c # в ваш файл .js, вероятно, не лучшая идея по разным причинам, таким как кэширование динамических переменных.Но иногда мы все должны делать то, что не должны.И если это так, то есть пакет NuGet, который позволяет вам писать синтаксис Razor в файле .js, который доступен здесь http://nuget.org/packages/RazorJS

0 голосов
/ 13 марта 2012

Если что-то перестает работать при обращении к внешнему js-файлу, возможно, вы делаете что-то не так.Предоставьте нам пример кода о том, как вы ссылаетесь на внешний файл.Другой способ - просто разместить JavaScript-код между тегами script где-нибудь в файле.Если он находится в _Layout.cshtml, вы можете поместить его в тег head и в другой файл cshtml, расположив его сверху между тегами script.

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