Вопрос

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

Так что у меня есть код в моем .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 Я думаю, но кажется, что Sorta Dump добавить дополнительные слои и производительность выполнения, просто чтобы выключить VS, и это не всегда вариант (я не могу вспомнить со своей головки, где это не вариант, но доверие Мне у меня была странная конструкция).

Так что мой вопрос, Как вы лучше всего написать это (Где лучше всего означает, что наименьшие, что VS жалобы)? Ни один eval Ни ajax звонит нужным этому IMO.

Это было полезно?

Решение

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

  1. Создайте ASP: Hiddenfield Control, установите его клиенту на «статический»
  2. Назначьте значение GetRelationsHipsForditrationship () в это поле на странице нагрузки
  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 правильно разбирается и подчеркивает ваш оригинальный фрагмент кода.

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

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

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

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

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

(редактировать)

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

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

и обратитесь ко всему, как:

servervars.GetProductsForEditRelationship

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top