Теги встроенного сервера 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. Он также отказывается форматировать мой документ, из-за ошибок синтаксического анализа. Последняя часть - мое худшее раздражение.

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

Итак, мой вопрос: как вы лучше всего это пишете (где лучше всего означает меньше жалоб против VS)? ни eval ни ajax звонки не соответствуют этому imo.

5 ответов

Решение

Если ваша цель состоит в том, чтобы уменьшить количество жалоб на VS, и если вы используете asp.net 4 (с поддержкой статических идентификаторов клиентов), может быть, такая стратегия будет лучше?

  1. Создайте элемент управления ASP:HiddenField, установите его ClientIdMode в "Static"
  2. Присвойте значение GetRelationshipsForEditRelationship() этому полю при загрузке страницы.
  3. В вашем 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 правильно его интерпретировал.

Другие вопросы по тегам