【问题标题】:GetScriptDescriptors() method for two .js files : strange unexpected behavior两个 .js 文件的 GetScriptDescriptors() 方法:奇怪的意外行为
【发布时间】:2012-11-07 19:48:57
【问题描述】:

我的自定义服务器端 ajax 控件实现了 IScriptControl:

  • GetScriptReferences
  • GetScriptDescriptors

第一种方法发送 javascript 文件,第二种方法基于一些较早发送的 .js 文件创建 javascript 对象。

在我的“AssembleyInfo”文件中,我添加了以下行并将属性资源管理器中的 .js 文件标记为“嵌入式资源”:

    // 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。

如果我在声明上发表评论,则第二次创建正常。

【问题讨论】:

  • 如果我错了请纠正我,但是我在前 2 个代码块中看到的一些 c# 代码

标签: javascript asp.net custom-server-controls


【解决方案1】:

你不能为同一个 DOM 元素注册多个控件定义 - 你会得到一个脚本错误:

Sys.InvalidOperationException:控件已与元素关联。

您需要更改一个或两个脚本类以继承 Sys.UI.Behavior 而不是 Sys.UI.Control

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

变成:

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

您还需要将相关的ScriptControlDescriptor 替换为ScriptBehaviorDescriptor

new ScriptControlDescriptor("YourType", ClientID);

变成:

new ScriptBehaviorDescriptor("YourType", ClientID);

查看 MSDN 上的扩展器控件演练,了解有关创建脚本行为的信息: http://msdn.microsoft.com/en-us/library/bb386403%28v=vs.100%29.aspx

【讨论】:

  • 我测试了几个描述符的 MSDN 示例 - 一切正常。但在我的情况下 ScriptBehaviorDescriptor 不能解决我的问题。我认为我不是从 ExtenderControl 派生的。但我不想这样做。我不需要扩展器。有什么方法可以返回几个描述符,或者我不能通过控制来做到这一点(只有行为)?
  • 我已经更新了我的答案 - 你不能有多个 Sys.UI.Control 与一个元素相关联。如果您将脚本类更改为继承Sys.UI.Behavior,您仍然可以从ScriptControl 使用它。
【解决方案2】:

似乎您的问题源于您使用两次返回的事实

yield return descriptor;
yield return descriptor2;

第一个返回然后结束,你不能有一个有两个返回的函数。尝试创建 IEnumerable 集合,将描述符放入其中,然后返回整个内容。

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

【讨论】:

  • 一个方法中不能有两个return 语句,但一个迭代器中可以有两个yield return 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2011-03-31
  • 2013-04-26
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多