在具有母版页的webform上使用javascript访问服务器控件?

时间:2010-11-28 14:36:54

标签: javascript asp.net webforms master-pages

我有一个使用母版页的webform,该母版页继承自另一个母版页。

我有一个下拉列表drpCursos

在我的javascript代码中,我尝试访问控件但没有运气:

var combo = document.forms[0]['drpCursos'];

combonull

检查源代码后,我将其更改为:

var combo = document.forms[0]['ctl00_ContentPlaceHolder1_drpCursos'];

它现在有效,但我认为这不是一个好的解决方案......

我怎么能以正确的方式做到这一点?

编辑:我的javascript代码位于外部文件中。

我尝试了Darin的解决方案,但它没有用,然后我将我的代码直接粘贴在aspx页面中,现在它已经工作了。

此外,它仅在代码位于函数内部时才有效,否则我会得到undefined

为什么会这样?

3 个答案:

答案 0 :(得分:2)

var combo = document.forms[0]['<%= drpCursos.ClientID %>'];

答案 1 :(得分:1)

Darin的解决方案可行,但如果你使用.net 4.0,现在可能有更好的解决方案。使用控件的ClientIDMode属性,您可以控制在运行时分配给控件的名称(即'ctl00_ContentPlaceHolder1_drpCursos')。

即。 <asp:Label ID="Label1" runat="server" ClientIDMode="[Mode Type]"/>

http://weblogs.asp.net/asptest/archive/2009/01/06/asp-net-4-0-clientid-overview.aspx

摘录如下:

模式类型

  • 旧版:如果未在控件层次结构中的任何位置设置ClientIDMode,则为默认值。这会导致客户端ID的行为方式与它们在2.0版(3.0和3.5未更改此代码路径)方面的行为相同。此模式将生成类似于“ctl00_MasterPageBody_ctl01_Textbox1”的ID。

  • 继承:这是每个控件的默认行为。这会查看控件父级以获取ClientIDMode的值。您不需要在每个控件上设置此值,因为它是默认值,仅在ClientIDMode已更改且新的所需行为是从控件父级继承时使用。

  • 静态:此模式完全按照您的想法执行,它使客户端ID静态。这意味着您为ID添加的内容将用于客户端ID。警告,这意味着如果在重复控件中使用静态ClientIDMode,则开发人员负责确保客户端ID唯一性。

  • 可预测:当框架需要确保唯一性时使用此模式,但需要以可预测的方式完成此操作。此模式最常见的用途是数据绑定控件。框架将遍历控制层次结构,为所提供的ID添加前缀,并使用其父控件ID,直到它到达ClientIDMode定义为static的层次结构中的控件。如果控件放在数据绑定控件内,则带有标识该实例的值的后缀也将添加到提供的ID中。 ClientIDRowSuffix属性用于控制将用作后缀的值(请参阅示例)。此模式将生成类似于“Gridview1_Label1_0”

  • 的ID

如果您只有一些控件需要使用javascript的ID,我个人会使用'静态'方法,分配我想要的ID,并让.net以默认方式分配其余ID。

答案 2 :(得分:0)

试试这个:

//default ID form asp.net is aspnetForm
// id$ = id ending with ...
var combo = $("form#aspnetForm").find("[id$='drpCursos']");

或者

var combo = $("form#aspnetForm").find("select[id$='drpCursos']");

此致