Как передать переменные в файл JS - PullRequest
4 голосов
/ 11 августа 2009

Я знаю, что есть простой ответ на этот вопрос, но это проявляется в виде 2 проблем.

Задача 1:

На странице asp.net есть блок javascript, подобный этому:

<script type="text/javascript">
    function doSomethingRandom() {
        var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
    }
</script>

Хорошо, это упрощенная версия проблемы, но она должна быть понятной. Теперь я хочу переместить эту функцию в файл JS ... но я не могу вставить asp: Literal в JS.

var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
<script src="myJSFile.js" />

... Меня немного тошнит, есть ли лучший способ?

Задача 2:

Аналогичная проблема, но на этот раз вторая версия выглядит так:

<asp:ScriptManagerProxy runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/tree/AttributeTree.js" />
    </Scripts>
</asp:ScriptManagerProxy>

Но на этот раз я не могу реально поставить

var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />

над ним, потому что с ScriptManagerProxy нет реального способа точно знать, где будет находиться файл скрипта.

Итак, это их проблемы! Спасибо.

Ответы [ 4 ]

3 голосов
/ 11 августа 2009

Мы используем метод Page RegisterStartupScript для регистрации функций инициализации в ClientScriptManager. Наши файлы Javascript содержат только функции и загружаются через ScriptManager (как в вашем фрагменте). Мы написали метод расширения для страницы (называемый JSStartupScript), который помогает с регистрацией скриптов запуска, и в конце дня наш код выглядит следующим образом:

<%
   Page.JSStartupScript(string.Format("initFeatureX({0}, {1}, {2});",
      AntiXss.JavaScriptEncode(ViewData.Property1),
      AntiXss.JavaScriptEncode(ViewData.Property2),
      AntiXss.JavaScriptEncode(ViewData.Property3)));
%>

Это также прекрасно работает в сочетании с коллекцией ScriptManager s CompositeScript и настройкой LoadScriptsBeforeUI = false.

1 голос
/ 11 августа 2009

В основном: вы не можете этого сделать.

Что вы можете сделать, это установить значение на сайте, которое генерируется ASP (как у вас сейчас), а затем обратиться к этой переменной из внешних js-скриптов, но это ужасно.

Другое решение заключается в том, что вы можете сохранить эту переменную в файле cookie (который будет установлен ASP), а затем прочитать этот файл cookie во внешнем JS. Вы также можете передать это значение URL-адресу сайта, который вы отображаете, и проанализировать URL-адрес в JS, чтобы получить значение, но я думаю, что cookie-файлы будут лучше для этого, так как у вас все еще будет чистый URL-адрес, и чтение cookie-файлов будет проще, чем анализ URL Титулы.

0 голосов
/ 11 августа 2009

Другой способ - динамически загружать файл javascript. Я имею в виду что-то вроде этого

<script>
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
ComponentLoad("/tree/AttributeTree.js"); //here Javascript file will be loaded
</script>

Но даже это не лучшее решение. Потому что будет много глобальных переменных, чем. Так что лучше сделать это:

<script>
ComponentLoad("/tree/AttributeTree.js","doSomethingRandom",{myVarToUse:"<asp:Literal runat="server" ID="HackyLiteral" />"}); //here Javascript file will be loaded
</script>
0 голосов
/ 11 августа 2009

Вы можете использовать файл aspx как файл js.

\<script src="<%= ResolveUrl("~/js/dynamic.aspx") %>"></script>

Вы можете делать все, что вы хотите в aspx.

...