【问题标题】:ASP.NET radiobuttonlist onclientclickASP.NET 单选按钮列表 onclientclick
【发布时间】:2010-04-27 18:55:39
【问题描述】:

我注意到 ASP.NET 控件集中的单选按钮列表没有 OnClientClick() 属性。这是微软有意的遗漏吗? 无论如何,我尝试将 OnClick 添加到单选按钮列表中,如下所示:

For Each li As ListItem In rblSearch.Items
    li.Attributes.Add("OnClick", "javascript:alert('jon');")
Next

但是很可惜,它不起作用。我什至检查了 firebug 中的源代码,并且单选按钮列表中没有显示 javascript。有谁知道如何让这个非常简单的事情发挥作用?我正在使用 ASP.NET 控件适配器,所以不知道这是否与它有关。

(我希望 asp.net/javascript 能开箱即用!!!)

【问题讨论】:

  • 向我们展示更多您的代码。您是将列表项绑定到后端的单选按钮列表,还是以声明方式在您的 aspx 中?
  • 4guysfromrolla.com/articles/091405-1.aspx 阅读“为什么属性不能应用于列表控件的列表项”部分
  • 不,它只是一个普通的旧静态列表。我认为下面的答案就是答案。我认为复选框列表属性根本不会被渲染。

标签: asp.net javascript vb.net


【解决方案1】:

我发现我可以向 RadioButtonList 添加一个 onclick 属性,它会按预期触发 javascript 客户端。

<asp:RadioButtonList ID="RadioButtonList1" runat="server" onclick="alert('RadioButtonListSelectChange');">
    <asp:ListItem Text="One" Value="1"/>
    <asp:ListItem Text="Two" Value="2"/>
</asp:RadioButtonList>

然后您可以编写一个客户端脚本来确定当前选定的列表项。

【讨论】:

  • 我在 FireFox 中尝试过,但发现 onclick 事件被触发了两次(大概每个列表项触发一次)。
  • @EdGraham,我有同样的经历,但我认为这与单击单选按钮的标签有关。该事件仅在单击无线电输入时触发一次,但在单击标签时触发两次。这使得这个答案几乎毫无用处。
【解决方案2】:

ListItem 对象中的onclick 属性功能很好。试试这样:

li.Attributes.Add("onclick", "javascript:showDiv()")

对我来说这个功能。

【讨论】:

    【解决方案3】:

    不是真正的答案,而是对其他建议的一些奇怪观察。我先说这是 ASP.Net 4.0 应用程序中的 RadioButtonList,RepeatDirection=Vertical

    1) 添加 onclick='myJsFunction(this);'在页面上的不同项目导致回发(例如按钮操作)之后,ListItems 的属性对我来说效果很好除了,ListItems 上的属性不会被渲染 strong> 在回发的结果中。它们被渲染以开始,但不是在有按钮操作时。去图吧。

    2) 显然,我们的遗留代码依赖于 RadioButtonList/ListItem 上的一些模糊的、不规范的行为,这些行为在回发时变得非常混乱。如果您在 ListItem 上放置 id 属性,ASP.Net 2.0+ 将在单选按钮周围添加 span 标记并将您的 id 值放在那里。如果您在其上添加 onclick 属性,该属性将出现在单选按钮上 - 至少在 Page.IsPostBack == false 时。

    <asp:RadioButtonList  ID="proceedChoice" runat="server" RepeatDirection="Vertical">
        <asp:ListItem id="Close_Case_Y" Value="Y" onclick="SelectResolveType(this);" Text="I want to close this case."  runat="server" />
        <asp:ListItem id="Close_Case_N" Value="N" onclick="SelectResolveType(this);" Text="I want to cancel this and start over."  runat="server" />
    </asp:RadioButtonList>
    

    呈现为

    <table id="...proceedChoice" border="0">
    <tr>
        <td><span id="Close_Case_Y"><input id="..._proceedChoice_0" type="radio" value="Y" onclick="SelectResolveType(this);" /><label for="..._proceedChoice_0">I want to close this case.</label></span></td>
    </tr><tr>
        <td><span id="Close_Case_N"><input id="..._proceedChoice_1" type="radio" value="N" onclick="SelectResolveType(this);" /><label for="..._proceedChoice_1">I want to cancel this case and start over.</label></span></td>
    </tr>
    </table>
    

    从其他按钮回发后,虽然相同的模板呈现为

    <table id="...proceedChoice" border="0">
    <tr>
        <td><input id="..._proceedChoice_0" type="radio" value="Y" /><label for="..._proceedChoice_0">I want to close this case.</label></td>
    </tr><tr>
        <td><input id="..._proceedChoice_1" type="radio" value="N" /><label for="..._proceedChoice_1">I want to cancel this case and start over.</label></td>
    </tr>
    </table>
    

    但真正奇怪的地方在于:如果您将除 id 和 onclick 之外的其他属性添加到 ListItem,只会保留那些 属性。例如,如果我将 hidden="hidden" 添加到 ListItems 之一,它会在回发后呈现如下

    <table id="...proceedChoice" border="0">
    <tr>
        <td><span hidden="hidden"><input id="..._proceedChoice_0" type="radio" value="Y" /><label for="..._proceedChoice_0">I want to close this case.</label></span></td>
    </tr><tr>
        <td><input id="..._proceedChoice_1" type="radio" value="N" /><label for="..._proceedChoice_1">I want to cancel this case and start over.</label></td>
    </tr>
    </table>
    

    【讨论】:

    • 查找有关 ListItems 如何仅将文本和值存储在视图状态中的帖子,这就是为什么属性在回发时丢失的原因,这是有道理的,但我仍然很困惑为什么在回发时会保留隐藏的属性那么……
    • 还用Reflector发现现在4guys RenderItem() override 建议已经被纳入框架了。
    【解决方案4】:

    因为它是一个列表控件,所以没有 OnClientClick 事件。使用回发 (SelectedIndexChange) 或编写 javascript 来获取每个单选按钮的点击。

    【讨论】:

      【解决方案5】:
                  foreach (PlaceType t in query.ToList())
              {
      
                  ListItem li = new ListItem(@"<img src=""" + t.ImageRelativePath + @"""/><br/>" + t.PlaceTypeText, t.PlaceTypeID.ToString());
                  li.Attributes.Add("onclick", "javascript:placeTypeChange('" + t.ImageRelativePath + "')");
                  rblPlaceTypes.Items.Add(li);
              }
      

      所以我在里面

      a) 迭代 EF 查询的结果。 b) 创建一个新的列表项,并将其添加到我的单选按钮列表 (rblPlaceTypes)。 c) 构造函数将图像放入以便显示。 d) li.Attributs.Add 将 javascript 连线放入其中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        相关资源
        最近更新 更多