我有一个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
内运行,所以我真的没有选择如何调用这个脚本。
答案 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_load
和contentPageLoad
函数都遵循我发现here的“插件”模式:
if(typeof functionname=='function') {
functionname()
}