Поддельный (пока не наносящий вред) "[WebElementId] не объявлен" Ошибка в VB.NET - PullRequest
1 голос
/ 16 июля 2010

Итак, у меня есть ошибка, упомянутая в заголовке, когда я пытаюсь создать свой веб-сайт через меню файлов.Код, который вызывает это, приведен ниже (JavaScript, который появляется в теге body):

            if(editedRow != null)
            {
                var SundayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_SunLocale.ClientID %>");
                var MondayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_MonLocale.ClientID %>");
                var TuesdayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_TuesLocale.ClientID %>");
                var WednesdayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_WedLocale.ClientID %>");
                var ThursdayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_ThursLocale.ClientID %>");
                var FridayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_FriLocale.ClientID %>");
                var SaturdayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_SatLocale.ClientID %>");

                if(currentCombo == "OFF" || currentCombo == "OFFICE")
                {                
                    if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_SunActivity")
                    {
                        SundayLoc.disable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_MonActivity")
                    {
                        MondayLoc.disable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_TuesActivity")
                    {
                        TuesdayLoc.disable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_WedActivity")
                    {
                        WednesdayLoc.disable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_ThursActivity")
                    {
                        ThursdayLoc.disable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_FriActivity")
                    {
                        FridayLoc.disable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_SatActivity")
                    {
                        SaturdayLoc.disable();
                    }

                    sender.hideDropDown();
                }
                else if(currentCombo != "OFF" && currentCombo != "OFFICE")
                {
                    if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_SunActivity")
                    {
                        SundayLoc.enable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_MonActivity")
                    {
                        MondayLoc.enable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_TuesActivity")
                    {
                        TuesdayLoc.enable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_WedActivity")
                    {
                        WednesdayLoc.enable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_ThursActivity")
                    {
                        ThursdayLoc.enable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_FriActivity")
                    {
                        FridayLoc.enable();
                    }
                    else if(rcbID == "FieldOpsScheduler_ctl00_ctl05_RCB_SatActivity")
                    {
                        SaturdayLoc.enable();
                    }

                    sender.hideDropDown();
                } 
            }

Теперь, что действительно странно (и, возможно, является основной причиной этого), это то, что когда я удаляю приведенный выше код,ровно половина ошибок, указывающих на эти имена идентификаторов элементов веб-формы, исчезает.Однако только половина - не все, что не имеет смысла, поскольку я избавился от всех частей кода JavaScript, которые запрашивают идентификаторы элементов веб-формы.

После удаления всех соответствующих JavaScript идважды щелкнув по оставшимся семи сообщениям об ошибках в VS2005, они выводят меня на самую первую строку кода на странице, а именно:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="DistrictSchedule.aspx.vb" Inherits="FieldOperations_DistrictSchedule" %>

Я и мой коллега не знаем, что происходит, двойка,Когда я избавлюсь от половины ошибок, по крайней мере страница будет выполнена.Однако все это ДОЛЖНО работать, судя по коду ..

Дополнительная информация об ошибке: я должен упомянуть, что те идентификаторы элементов веб-формы, которые я пытаюсь найти, существуют ТОЛЬКО, когда мой RadGrid работаетв режиме редактирования, поэтому имело бы смысл, чтобы они изначально не были там с самого начала.В любом случае, это НЕ должно вызывать ошибку, наносящую ущерб сайту, хотя по какой-либо причине это так.Наконец, конкретные строки, выдающие ошибку, - это те, которые используют $ find, и строки, использующие переменные, которые $ find получает значения и для выброса ошибки.

Тот, кто может рассказать мне, что происходит, будетбыть главной помощью.Заранее благодарю.

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Рад, что вы нашли свое собственное решение.Для дальнейшего разъяснения, вот что происходит.

<%= %>

Выше приведено сокращение от Response.Write.Итак, когда вы используете следующую строку кода:

var whatever = $find("<%= SomeControlIDDeclaredServerSide.ClientID %>");

Вы сообщаете своей странице ASPX, чтобы получить ClientID вашего серверного элемента управления, а затем выводить этот идентификатор в ваш JavaScript при обработке страницы,в результате получается что-то вроде этого на отображаемой странице:

var whatever = $find("ctl00_ctl05_SomeControlIDDeclaredServerSide");

Это часто используется при программировании JavaScript с ASP.NET для получения HTML-идентификатора серверных элементов управления на стороне клиента, поскольку ASP.NET может динамическикорректирует идентификаторы HTML во время выполнения.Этот код гарантирует, что у вас всегда будет правильный идентификатор в JavaScript, независимо от настроек именования контейнеров ASP.NET.

Если ваш идентификатор клиента является статическим (то, что вы устанавливаете во время разработки, это то, что отрисовывается длястраницы), то вам не нужен поиск ClientID, и вместо этого вы можете написать это:

var whatever = $find("SomeControlIDAsDisplayedOnWebpage");

Где «SomeControlID ...» - это фактический HTML-идентификатор целевого элемента управления.Метод JavaScript $find будет непосредственно искать этот HTML-идентификатор и получать ссылку на объект HTML.

Надеюсь, что это поможет с вопросом "почему".

1 голос
/ 16 июля 2010

Так что у меня появилась яркая идея исправить это, когда я случайно просмотрел какую-то другую страницу в поисках информации о find() и Telerik. Я заметил, что в некоторых случаях у вас есть такие вещи, как:

var whatever = $find("<%= SomeControlIDDeclaredServerSide.ClientID %>");

А в других случаях у вас есть такие вещи, как:

var whatever = $find("SomeControlIDAsDisplayedOnWebpage");

Оказывается, эти две довольно похожие строки кода не являются взаимозаменяемыми, хотя на первый взгляд можно подумать, что это так. Конкретно, что избавило меня от ВСЕХ этих крайне раздражающих ошибок в моем случае, так это использование второй строки без скобок и знаков процента.

Моя теория относительно того, почему вторая строка работает в моем случае, а не первая, состоит в том, что при выборе Compile / Build Website, если вы используете код наподобие первой, компилятор ожидает, что ваш объект будет создан с помощью синтаксиса разметки в. Страница ASPX сразу во время выполнения. В моем случае «FieldOpsScheduler_blahblahblah» создавался динамически, когда моя RadGrid переводится в режим редактирования (поэтому не сразу во время выполнения).

В любом случае, надеюсь, мой опыт поможет кому-то, кто сталкивается с этой проблемой или схожей.

...