代码之家  ›  专栏  ›  技术社区  ›  Gustavo Puma

在带有母版页的web表单上使用javascript访问服务器控件?

  •  0
  • Gustavo Puma  · 技术社区  · 14 年前

    我有一个网络表单,它使用一个母版页,然后从另一个母版页继承。

    我有一个下拉列表 drpCursos

    在我的javascript代码中,我试图访问控件,但没有成功:

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

    combo null

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

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

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

    我该怎么做才对?

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

    我尝试了达林的解决方案,但没有成功,然后我把代码直接粘贴到aspx页面,现在它成功了。

    而且,它只在代码位于函数内部时才起作用,否则 undefined

    为什么会这样?

    3 回复  |  直到 14 年前
        1
  •  1
  •   E.J. Brennan    14 年前

    Darin的解决方案可以工作,但是如果您使用.NET4.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

    摘录如下:

    模式类型

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

    • 继承:这是每个控件的默认行为。这将查找控件父级以获取其clientdmode的值。您不需要对每个控件都设置此值,因为它是默认值,仅当更改了clientMode并且新的所需行为是从控件父级继承时才使用此值。

    • 静态的:这个模式做你想做的事情,它使客户端ID是静态的。这意味着您为ID放置的内容将用于客户端ID。警告,这意味着如果在重复控件中使用静态ClientIDMode,开发人员将负责确保客户端ID的唯一性。

    • 可预测:当框架需要确保唯一性,但需要以可预测的方式这样做时,使用此模式。此模式最常用于数据绑定控件。该框架将遍历控制层次结构,将所提供的ID与其父控件ID分开,直到它到达层次结构中的一个控件,该控件的定义为静态的。如果控件放在数据绑定控件中,则还将向提供的ID添加一个后缀,该后缀的值标识该实例。ClientIDRowSuffix属性用于控制将用作后缀的值(请参阅示例)。此模式将生成一个类似于Gridview1_Label1_0的ID

    如果您只有一些需要ID用于javascript的控件,我会亲自使用“static”方法,分配所需的ID,并让.net以默认方式分配其余的ID。

        2
  •  2
  •   Darin Dimitrov    14 年前
    var combo = document.forms[0]['<%= drpCursos.ClientID %>'];
    
        3
  •  0
  •   MBahamondes    9 年前

    试试这个:

    //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']");
    

    当做