Теги встроенного сервера ASP.NET
Я хотел бы начать с того, что мой код работает отлично, это скорее вопрос "как лучше это сделать".
Так что у меня есть такой код в моем .aspx
файл:
function EditRelationship() {
var projects=<%= GetProjectsForEditRelationship() %>;
// fill in the projects list
$('#erProjectsSelect').empty();
for(var i in projects)
$('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');
var rels=<%= GetRelationshipsForEditRelationship() %>;
// etc
}
Опять же, работает нормально. Проблема в том, что VS2008 как бы задыхается от такого кода, это подчеркивает <
символ в тегах (со связанными предупреждениями), затем отказывается предоставить завершение кода для остальной части JavaScript. Он также отказывается форматировать мой документ, из-за ошибок синтаксического анализа. Последняя часть - мое худшее раздражение.
Я мог бы положить некоторые из них в eval
s Я думаю, но кажется немного глупым добавлять дополнительные слои и хиты производительности во время выполнения, чтобы просто закрыть VS, и это не всегда вариант (я не могу вспомнить, где это было не вариант, но доверие у меня была странная конструкция).
Итак, мой вопрос: как вы лучше всего это пишете (где лучше всего означает меньше жалоб против VS)? ни eval
ни ajax звонки не соответствуют этому imo.
5 ответов
Если ваша цель состоит в том, чтобы уменьшить количество жалоб на VS, и если вы используете asp.net 4 (с поддержкой статических идентификаторов клиентов), может быть, такая стратегия будет лучше?
- Создайте элемент управления ASP:HiddenField, установите его ClientIdMode в "Static"
- Присвойте значение GetRelationshipsForEditRelationship() этому полю при загрузке страницы.
- В вашем javascript вместо этого прочитайте значение из скрытого поля, я полагаю, вы знаете, как это сделать.
Это больше работы, чем ваше решение, и вы добавите некоторые данные в обратную передачу (если вы ее выполняете), но это не вызовет никаких жалоб VS, я думаю:)
Вы можете сделать это со своей страницы в коде позади
ClientScript.RegisterArrayDeclaration("projects", "1, 2, 3, 4");
или построить что-то вроде JSON, вы можете написать это
ClientScript.RegisterClientScriptBlock(GetType(), "JSONDeclarations", "your json stuff");
ОБНОВЛЕНИЕ На основании моего комментария
<script id="declaration" type="text/javascript">
var projects=<%= GetProjectsForEditRelationship() %>;
var rels=<%= GetRelationshipsForEditRelationship() %>;
</script>
<script type="text/javascript">
function EditRelationship() {
// fill in the projects list
$('#erProjectsSelect').empty();
for(var i in projects)
$('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');
}
</script>
У меня не установлен VS2008 для тестирования, так что возьмите это с крошкой соли, но вы пробовали что-то подобное?
var projects = (<%= GetProjectsForEditRelationship() %>);
Нечто подобное может заставить парсер JavaScript игнорировать содержимое вашего выражения.
Для чего стоит VS2010 правильно проанализирует и выделит ваш оригинальный фрагмент кода.
Лучшее решение - поместить javascript в отдельный файл и полностью избежать этого. Для этой конкретной функции вы выполняете работу на стороне сервера. Почему бы не создать список опций, которые вы намереваетесь динамически добавить в codebehind, поместить их в скрытый div, а затем просто добавить jQuery из уже отрендеренного HTML?
Если у вас есть ситуация, когда вы действительно хотите динамически создавать много javascript таким образом, рассмотрите возможность использования ScriptManager в codebehind для установки переменных, которые вам понадобятся в качестве сценариев, и зарегистрируйте их, тогда ваш встроенный сценарий не должен будет экранироваться
ScriptManager.RegisterClientScript("projects = " + GetProductsForEditRelationship());
(По сути, это не полный синтаксис, который зависит от контекста). Затем обратитесь к "проектам" в вашей функции.
(редактировать)
Немного более чистый способ сделать это в большем масштабе, настройте все, что вам нужно, вот так в codebehind:
string script = "var servervars = {" +
"GetProductsForEditRelationship: " + GetProductsForEditRelationship() +
"GetRelationshipsForEditRelationship: " + GetRelationshipsForEditRelationship() +
"}"
и относиться ко всему, как:
servervars.GetProductsForEditRelationship
Если вы делаете это много, конечно, вы можете создать класс для автоматизации построения скрипта.
Есть ли возможность перенести это на VS2010? Я просто скопировал и вставил ваш код, и IDE правильно его интерпретировал.