我有一个使用母版页的webform,该母版页继承自另一个母版页。
我有一个下拉列表drpCursos
在我的javascript代码中,我尝试访问控件但没有运气:
var combo = document.forms[0]['drpCursos'];
combo
是null
检查源代码后,我将其更改为:
var combo = document.forms[0]['ctl00_ContentPlaceHolder1_drpCursos'];
它现在有效,但我认为这不是一个好的解决方案......
我怎么能以正确的方式做到这一点?
编辑:我的javascript
代码位于外部文件中。
我尝试了Darin的解决方案,但它没有用,然后我将我的代码直接粘贴在aspx页面中,现在它已经工作了。
此外,它仅在代码位于函数内部时才有效,否则我会得到undefined
为什么会这样?
答案 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”
如果您只有一些控件需要使用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']");
此致