代码之家  ›  专栏  ›  技术社区  ›  technomalogical

ASP.NET Ajax和UserControls:处理客户端脚本

  •  1
  • technomalogical  · 技术社区  · 15 年前

    我有一个用户控件,我想根据一些业务规则在一个页面中多次编程。当前控件有一个必须在ASP.NET Ajax上调用的javascript函数 pageLoad 事件。

    我正在使用母版页具有 页页 调用 contentPageLoad 任何ContentTemplate上的函数(如果该函数存在)。然后,保存有问题的用户控件的ContentTemplate将负责在此事件期间对用户控件调用适当的函数。

    现在,javascript在 .ascx 对于用户控件,但我感觉需要使用 Page.ClientScript 属性以通过代码隐藏注入它。我的问题是:如何确保我的函数名不会被删除,并确保调用适当的方法 每个 UserControl?

    仅供参考:需要为每个用户控件执行的代码是一个jquery块,它从标准HTML创建一个多选控件。 <select> .

    编辑: RegisterStartupScript 是建议的,但这在完成加载DOM之前运行。将函数包装在jquery文档中。ready()似乎没有帮助。用户控件正在 UpdatePanel 所以我没有选择如何调用这个脚本。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Dan Davies Brackett    15 年前

    一种解决方案是使用 ClientID JS函数定义中的用户控件:

    function onLoadInitialize_<%=ClientID%>(){/*do things*/}
    

    然后使用 Page.ClientScript.RegisterStartupScript 使其在客户端加载期间发生。意识到 page_load happens on every asynchronous postback ;如果希望每次实际页面加载(不包括异步回发)只发生一次,请改用init事件。

        2
  •  2
  •   technomalogical    15 年前

    所以我最终采用了一种混合的方法来处理@ddaviesbrackett的建议。我正在向注册函数 Page.ClientScript 不是作为启动脚本,而是作为客户端脚本块。函数使用类而不是ID(因此, ClientID s)连接到每个控件。基本结构为:

    if(!Page.ClientScript.IsClientScriptBlockRegistered(Page.GetType(),"scriptkey"))
    {
        Page.ClientScript.RegisterClientScriptBlock(
            Page.GetType(),"scriptkey",script,true);
    }
    

    使用以下脚本:

    function bindMultiSelects() {
        $('.multiselectclass').multiSelect({
            oneOrMoreSelected: '*', 
            noneSelected: 'Select Item(s)'
        });
    }
    

    (使用Awesome jQuery MultiSelect plugin )

    同样,这是因为我的母版页创建了 page_load 方法,然后对内容调用方法,然后调用 bindMultiSelects . 仅供我参考, 页负荷 contentPageLoad 函数都遵循我发现的这个“插件”模式 here :

    if(typeof functionname=='function') {
        functionname()
    }