Метод GetScriptDescriptors () для двух.JS-файлов: странное неожиданное поведение

мой пользовательский серверный элемент управления ajax реализует IScriptControl:

  • GetScriptReferences
  • GetScriptDescriptors

Первый метод отправляет файлы javascript, второй создает объекты javascript на основе некоторых отправленных ранее.файлы js.

в моем файле "AssembleyInfo" я добавил ниже строки и отметил .JS-файлы в проводнике свойств как "Embedded resourece":

    // this allows access to this files
    [assembly: WebResource("ProjectName.file1.js", "text/javascript")]

    [assembly: WebResource("ProjectName.file2.js", "text/javascript")]

вот реализация IScriptControl :

            public IEnumerable<ScriptReference>  
                GetScriptReferences()
            {
                yield return new ScriptReference("ProjectName.file1.js", this.GetType().Assembly.FullName);
                yield return new ScriptReference("ProjectName.file2.js", this.GetType().Assembly.FullName);
            }

            public IEnumerable<ScriptDescriptor>
                GetScriptDescriptors()
             {


                ScriptControlDescriptor descriptor = new ScriptControlDescriptor("ProjectName.file1", this.ClientID);
                //adding properties and events (I use "AnotherName" on the safe side to avoid potentional namespace problems           
                ScriptControlDescriptor descriptor2 = new ScriptControlDescriptor  ("AnotherName.file2", this.ClientID);
                //adding properties and events   

                yield return descriptor;
                yield return descriptor2;

            }

Вот части моего .файлы JS:

  • первый файл

    Type.registerNamespace("ProjectName");
    
    ProjectName.file1 = function (element) {
    .......
    .......
    }
    ProjectName.file1.registerClass('ProjectName.file1', Sys.UI.Control);
    
    if (typeof (Sys) !== 'undefined')
        Sys.Application.notifyScriptLoaded();
    
  • второй файл

    Type.registerNamespace("AnotherName");
    
    AnotherName.file2 = function (element) {
    ............
    ............
    }
    AnotherName.file2.registerClass('AnotherName.file2', Sys.UI.Control);
    
    if (typeof (Sys) !== 'undefined')
        Sys.Application.notifyScriptLoaded();
    

ПОЧЕМУ СОЗДАЕТСЯ ТОЛЬКО ПЕРВЫЙ ОБЪЕКТ?

    yield return descriptor

МОЙ ASPX ИМЕЕТ JAVASCRIPT, КОТОРЫЙ ДОЛЖЕН СОЗДАТЬ ВТОРОЙ.

ЕСЛИ Я КОММЕНТИРУЮ ВЫШЕ, ОПЕРАТОР SECOND СОЗДАЕТ НОРМАЛЬНО.

2 ответов


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

Sys.InvalidOperationException: элемент управления уже связан с элементом.

вам нужно будет изменить один или оба класса скриптов для наследования Sys.UI.Behavior вместо Sys.UI.Control:

YourType.registerClass("YourType", Sys.UI.Control);

будет:

YourType.registerClass("YourType", Sys.UI.Behavior);

Вам также нужно будет заменить соответствующий ScriptControlDescriptor С a ScriptBehaviorDescriptor:

new ScriptControlDescriptor("YourType", ClientID);

будет:

new ScriptBehaviorDescriptor("YourType", ClientID);

посмотрите на элемент управления extender walk-through на MSDN для получения информации о создании поведения сценария: http://msdn.microsoft.com/en-us/library/bb386403%28v=vs.100%29.aspx


похоже, ваша проблема связана с тем, что вы используете два возврата

yield return descriptor;
yield return descriptor2;

сначала один делает возврат, а затем его окончание, вы не можете иметь функцию, которая имеет два таких возврата. Попробуйте создать коллекцию IEnumerable, поместите дескрипторы внутрь,а затем верните все.

List<ScriptDescriptor> descList = new List<ScriptDescriptor>();
descList.add(descriptor);
descList.add(descriptor2);
return descList;