Теги встроенного сервера ASP.NET - PullRequest
1 голос
/ 07 января 2011

Я хотел бы начать с того, что мой код работает отлично, это скорее вопрос "как лучше это сделать".

Итак, у меня есть такой код в моем .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 ]

2 голосов
/ 07 января 2011

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

  1. Создать ASP: Элемент управления HiddenField, установите для его ClientIdMode значение «Static»
  2. . Присвойте значение GetRelationshipsForEditRelationship () этому полю при загрузке страницы.
  3. . В вашем JavaScript, вместо этого прочитайте значение из скрытого поляПредположим, вы знаете, как это сделать.

Это больше, чем ваше решение, и вы добавите некоторые данные в обратную передачу (если вы ее выполните), но это не вызовет жалоб VS:)

2 голосов
/ 07 января 2011

Вы можете сделать это со своей страницы в коде

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>
0 голосов
/ 07 января 2011

Можно ли переместить это на VS2010? Я просто скопировал и вставил ваш код, и среда IDE правильно его интерпретировала.

0 голосов
/ 07 января 2011

У меня не установлен VS2008 для тестирования, так что возьмите это с крошкой соли, но вы пробовали что-то подобное?

var projects = (<%= GetProjectsForEditRelationship() %>);

Нечто подобное может заставить парсер JavaScript игнорировать содержимое вашего выражения.

Для чего стоит, VS2010 правильно анализирует и выделяет ваш оригинальный фрагмент кода.

0 голосов
/ 07 января 2011

Лучшее решение - поместить javascript в отдельный файл и полностью избежать этого.Для этой конкретной функции вы выполняете работу на стороне сервера.Почему бы не создать список опций, которые вы намереваетесь динамически добавить в codebehind, поместить их в скрытый div, а затем просто добавить jQuery из уже отрендеренного HTML?

Если у вас есть ситуация, когда выесли вы действительно хотите динамически создавать много JavaScript таким образом, рассмотрите возможность использования ScriptManager в codebehind для установки переменных, которые вам понадобятся как скрипты, и зарегистрируйте их, тогда вашему встроенному скрипту не нужно будет экранировать

ScriptManager.RegisterClientScript("projects = " + GetProductsForEditRelationship());

(По сути, это не полный синтаксис, который зависит от контекста).Затем обратитесь к «проектам» в вашей функции.

(правка)

Немного более чистый способ сделать это в большем масштабе, настройте все, что вам нужно, как это в codebehind:

string script = "var servervars = {" +
  "GetProductsForEditRelationship: " + GetProductsForEditRelationship() + 
  "GetRelationshipsForEditRelationship: " + GetRelationshipsForEditRelationship() +
"}"

и ссылаются на все, например:

servervars.GetProductsForEditRelationship

Если вы делаете это много, конечно, вы можете создать класс для автоматизации построения сценария.

...