Встраивание кода C # с использованием <% = code%> в теги javascript <script> - PullRequest
2 голосов
/ 15 ноября 2009

Я использую ASP.NET MVC и хотел бы получить информацию о модели для использования в моем JavaScript. Я строго напечатал представление и, таким образом, могу использовать <%= Model.Name %> в своем HTML для получения данных модели.

Но как только я нахожусь в тегах <script>, я не получаю intellisense (в Visual Studio) при использовании <%, и кажется, что информация не отображается должным образом. Я что-то упускаю, чтобы иметь возможность использовать схему угловых скобок в Javascript? </p>

Спасибо.

УТОЧНЕНИЕ: Я должен был опубликовать код, который пытаюсь использовать в первый раз. Чтобы уточнить немного, я пытаюсь использовать $ .getJSON JQuery для получения данных из модели (через контроллер) и заполнить объект JSON. Я использую javascript ниже:

    <script type="text/javascript">
    $(document).ready(function() {
        $.getJSON("<%=Url.Action("PopulateJournalOptions", "Evaluation", Model.ID) %>", populateJSON);
    });
</script>

PopulateJournalOptions - это мое действие контроллера, Evaluation - это имя контроллера, а Model.ID - то, что я пытаюсь передать ему. Кстати, я смогу добиться того же, используя:

<script type="text/javascript">
    $(document).ready(function() {
        $.getJSON("/Evaluation/PopulateJournalOptions/<%= Model.ID %>", populateJSON);
    });
</script>

Но даже здесь я не уверен, что эти угловые скобки используются правильно. Это определенно выглядит немного не так. Спасибо за помощь.

UDPATE: Мы пошли дальше и попробовали второй способ, описанный выше, и он действительно работает. У меня все еще есть проблемы с использованием первого метода, который использует Url.Action (), что является позором, потому что я думаю, что это лучший метод. Но теги <% определенно отображают данные. Я предполагаю, что это только бросило меня, когда не было intellisense, и они не выдвигали на первый план как нормальный. Спасибо за быстрые ответы. Любые идеи о правильном формате для первого варианта выше? </p>

Ответы [ 5 ]

2 голосов
/ 15 ноября 2009

Это должно работать - ваш C # должен выполняться на стороне сервера, прежде чем JavaScript будет на стороне клиента. Intellisense может быть просто перепутан контекстом.

Я иногда использую эту технику с PHP и JavaScript.

2 голосов
/ 15 ноября 2009

Вообще говоря, блоки <% =%> должны использоваться только в кавычках в Javascript. Поскольку вы внутри цитируемого текста, Intellisense может не работать.

1 голос
/ 15 ноября 2009

Поправь меня, если я ошибаюсь, но я никогда не видел Url. Действие используется так:

<%= Url.Action("PopulateJournalOptions", "Evaluation", Model.ID) %>

не должно ли быть так?

<%= Url.Action("PopulateJournalOptions", "Evaluation", new { ID = Model.ID } ) %>

Примечание новый {ID = Model.ID}

Url.Action использует отражение в свойствах объекта, чтобы выяснить, каковы значения маршрута. Поскольку объект int не имеет полей / свойств, он ничего не обнаружит.

1 голос
/ 15 ноября 2009

Вы должны быть осторожны при записи строк в теги скрипта, потому что, поскольку это javascript, ожидается, что строка имеет специальные символы, закодированные должным образом. Кроме того, если эта строка содержит что-то вроде «», вы рискуете браузерами, которые не запускают javascript, заканчивая блок скрипта раньше.

Простой способ кодирования строк - использование сериализатора JSON, возможно JavaScriptSerializer ().

<script>
    var targetUrl = <%= (new JavaScriptSerializer()).Serialize("http://url/") %>;
</script>

Я думаю, что это безопаснее. Вы хотите поместить этот код во вспомогательную функцию, я просто создаю экземпляр JavaScriptSerializer () там, чтобы это был самый простой пример.

Одним из побочных эффектов этого является то, что выражение <% =%> не находится в кавычках, что, похоже, поможет вашей первоначальной поддержке автозаполнения. Обратите внимание, что Serialize () не только правильно экранирует строку для javascript, но также экранирует символы «<» и «>», поэтому сценарий «» не может быть выполнен.

0 голосов
/ 15 ноября 2009

Вы можете попробовать одинарные кавычки:

$.getJSON('<%=Url.Action("PopulateJournalOptions", "Evaluation", Model.ID) %>', populateJSON);
...