【问题标题】:How to write Javascript in the code behind file?如何在文件后面的代码中编写 Javascript?
【发布时间】:2026-01-08 23:35:02
【问题描述】:

下面是我的代码快照,其中包括从 gridview 的项目模板中获取的 javascript。它还放置了一个图像控件。

  <ItemTemplate>
    <a href="javascript:ShowChildGrid('div<%# Eval("ID#") %>');">
                        <img id="imgdiv<%# Eval("ID#") %>" alt="Click" border="0" src="plus.gif" />
    </a> </ItemTemplate>

JS 函数接受一个参数作为 ID。现在如何在文件后面的代码中编写 JS?

之所以需要,是因为我需要根据gridview的行数据绑定事件中的某些条件显示图像。

P.S.:我知道注册启动脚本和客户端脚本,但我不确定它们如何满足我的条件。

【问题讨论】:

  • 您可能需要解释更多:数据绑定事件是服务器端事件/进程,而javascript只有在页面完全呈现并发送到浏览器后才能工作。
  • 场景:Gridview 包含一个单元格,如果变量的值为 1,则该单元格应显示加号 (imgdiv) 的图像,否则不应显示图像。如果显示图像,我正在从 JS(ShowChildGrid)打开一个子网格。正在 gridview (Parent) rowdataBound 事件中检查此条件。图像可见/隐藏也完成了。但是如果图像是可见的,那么子网格就不会被显示,因为剩下的 JS 处理..有任何疑问吗?告诉我

标签: c# javascript .net asp.net visual-studio


【解决方案1】:

如果您想在 RowDataBound-event 中为 gridview 的每个项目设置 JS 代码,您可以在 ItemTemplate 中添加一个 Hyperlink-control,并将该控件的 NavigationUrl-property 设置为 JS

<ItemTemplate>
    <asp:Hyperlink runat="server" id="lnk" ImageUrl="..."/>
    ...
</ItemTemplate>

RowDataBound-eventhandler:

...
if (e.Row.RowType != DataControlRowType.DataRow)
    return;
string js = String.Format("javascript:ShowChildGrid('div{0}');", rowId);
var lnk = e.Row.FindControl("lnk") as Hyperlink;
if(lnk!=null)
{
    lnk.NavigationUrl = js;
    lnk.ImageUrl = ...;
}

当然,您也可以使用aimg 使用runat-Attribute

【讨论】:

  • +1 即使我个人不是 var 的粉丝,如果类型是已知的并且使用 aimg 和 runat="server" 对我来说总是感觉像是一个黑客。但你说的是真的,你的答案是正确的。
  • 我认为 OP 不在 rowId 之后,而是在字段 ID 的值之后。在这种情况下,OP 仍然需要使用DataBinder.Eval(e.dataItem, "ID") 来获取正确的 ID。
  • Stephan:看不到您在代码中所做的更改。另外,我的变量 lnk 也变空了。为什么我的 GV 找不到控件??
  • 你检查了 RowType 吗? if (e.Row.RowType != DataControlRowType.DataRow) { return; }(我刚刚在上面的代码中添加了这个)你的超链接的 id 是“lnk”吗?
  • 那是一些非常突兀的 javascript。你不能告诉他改变他的 HTML 并使用不显眼的 javascript 而不是使用这个 hack 吗?
【解决方案2】:

更改您的模板并使用不显眼的 javascript。

<ItemTemplate>
    <button class="imgdiv-button" data-img-id='<%# Eval("ID#") %>'>
        <img class="imgdiv" alt="Click" border="0" src="plus.gif" />
    </button> 
</ItemTemplate>

$(".imgdiv-button").click(function() {
    ShowChildGrid($(this).data('img-id'));
});

基本上你想要一个按钮而不是一个链接(因为它是一个按钮)。而且您应该将该 img-id 存储在 data- 属性中。

【讨论】: