如何从ASPX控件事件中调用Javascript函数?

时间:2009-03-04 19:40:57

标签: asp.net javascript

如何从ASPX控件事件中调用Javascript函数?

具体来说,我想从DropDownList的SelectedIndexChanged事件中调用该函数。

4 个答案:

答案 0 :(得分:14)

每当我看到这样的问题时,我都会感到有点紧张,因为十分之九意味着提问者并不真正理解发生了什么。

当您的SelectedIndexChanged事件在服务器上触发时,它将作为完整回发的一部分触发。这意味着要运行该代码,页面的其余部分加载代码也必须运行。

更重要的是,代码作为来自浏览器的新http请求的结果运行。就浏览器而言,结果中会返回一个全新的页面。旧页面和旧DOM将被丢弃。因此,当您的SelectedIndexChanged事件代码运行时,您要调用的javascript函数甚至不存在于浏览器中。

那又该做什么呢?您有几个选择:

  • 更改页面,以便控件根本不回发到服务器。在客户端以javascript完全检测更改。这是我的首选选项,因为它避免了浏览器页面中的奇怪的onload脚本,并且可以节省服务器的工作量。缺点是它使你的页面依赖于javascript,但这并不是什么大问题,因为如果禁用javascript,这从一开始就注定要失败。
  • 使用ClientScript.SetStartupScript()在SelectedIndexChanged事件中设置所需的javascript以运行onload。
  • 将javascript的预期结果应用于页面的服务器模型。即使关闭了javascript(可访问性),这也具有工作的优势,但是以在服务器上做更多工作为代价,花费更多时间来推断页面的逻辑状态,并且可能需要复制客户端和服务器端逻辑。此外,此事件依赖于javascript:如果javascript被禁用,则不会触发。
  • 第一个和第三个选项的某些组合也是可能的,这样它在本地使用javascript(如果可用),但如果没有,则回发到服务器。就个人而言,我希望看到更好,更直观,支持ASP.Net内置的内容。但同样:我在谈论一般情况。此特定事件需要javascript才能正常工作。

答案 1 :(得分:2)

正如Muerte所说,你必须在后面的代码中放置javascript,或者在页面上调用它。我个人用这个:

ClientScript.RegisterClientScriptBlock("customscript", "<script>simple script here</script>")

如果您在页面上已经有一个更复杂的功能而不是我拥有的东西,您可以调用该功能。

答案 2 :(得分:1)

您不能直接从事件中执行此操作,因为ASPX控件事件是服务器端。

你可以做的是在ASPX事件中发出一个Javascript,它会在页面重新加载时调用JavaScript函数。

例如,如果在ASPX页面中有一个名为“DoSomething()”的Javascript函数,则在ASPX控件事件中添加以下内容:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    Page.ClientScript.RegisterStartupScript(this.GetType(), "myEvent", "DoSomething()", true);
}

最后一个布尔参数定义了标签是自动添加的。

答案 3 :(得分:0)

在后面的代码中,通过其属性集合将一些标记附加到服务器端控件。这假定该函数已经存在于页面已经可用的客户端脚本文件中。

MyServerDDLControl.Attributes.Add("SelectedIndexChanged", "MyClientSideFunction();");