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

时间:2009-06-16 15:44:22

标签: asp.net jquery ajax

我有一个UserControl,我希望根据一些业务规则以编程方式多次包含在页面中。目前,该控件具有必须在ASP.NET AJAX pageLoad事件上调用的JavaScript函数。

我正在使用一种模式,其中Master页面具有pageLoad函数,如果函数存在,则在任何ContentTemplate上调用contentPageLoad函数。保存UserControl的ContentTemplate将负责在此事件期间调用UserControl上的相应函数。

现在,JavaScript在UserControl的.ascx内联,但我觉得我需要使用Page.ClientScript属性通过代码注入它。我的问题是:如何确保我的函数名称不被破坏,并确保为每个 UserControl调用适当的方法?

仅供参考:需要为每个UserControl执行的代码是一个jQuery块,它从标准HTML <select>创建一个Multi-Select控件。

建议

编辑: RegisterStartupScript,但这会在DOM加载完成之前运行。将函数包装在jQuery Document.ready()中似乎没有帮助。用户控件在UpdatePanel内运行,所以我真的没有选择如何调用这个脚本。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

所以我最终采用混合方法来解决@DDaviesBrackett建议的问题。我正在使用Page.ClientScript注册一个函数,而不是作为启动脚本,而是作为ClientScriptBlock。该函数使用类而不是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)'
    });
}

(使用真棒jQuery MultiSelect plugin

同样,这是有效的,因为我的母版页创建了一个page_load方法,然后调用内容上的方法,然后调用bindMultiSelects。仅供我自己参考,page_loadcontentPageLoad函数都遵循我发现here的“插件”模式:

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