Метод 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;