1

当ASP.NET (2.0) 下拉列表的更改事件由 jQuery 处理时,我正在使用 jQuery 尝试触发方法。问题是下拉列表位于网格视图内,即使这样,只有当用户决定编辑该网格视图中的一行时。

我想我让它使用 ASP 代码块来拾取对象,但问题是当页面第一次加载时,行的编辑索引不存在并且会引发错误。将块放在IF语句中也不起作用。

$(document).ready(function() //when DOM is ready, run containing code
{
    <% if (grvTimeSheets.EditIndex > -1) {%>
        $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() {
             $(#<%= grvTimeSheets.ClientID %>).block({ message: null }
        });
}
);
<% } %>

这是我的一次尝试,我还尝试将 IF 语句 ASP 代码放在 JavaScript 块之外。它也不起作用。

如何将 jQuery 事件应用到 drop drop 框?理想情况下尽可能简洁。


感谢您的回答,但不,它不起作用:(。JavaScript代码似乎没有被输出......令人困惑......

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //When DOM is ready, run the containing code
    {

    }
    );
</script>

是输出。即使这是代码:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //when DOM is ready, run containing code
    {<% if (grvTimeSheets.EditIndex > -1) {%>
        var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
        $(id).change(function() {
             $(id).block({ message: null }
        });
     <% } %>
    }
    );
</script>

以前也是这样,让我发疯。


对不起,你能说得清楚一点吗?我尝试在后面的代码中定义整个事情,如下所示:

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
          csm.RegisterStartupScript(cstype, csname1, script, true);
}

这是你的意思吗?

顺便说一句,以上没有奏效。没有错误,只是没有任何事件起作用。

4

9 回答 9

2

这里有几件事。

  1. 当您将选择器传递给$()函数时,您需要将它们用引号括起来。上面的代码片段会生成类似 的东西$(#some-generated-id),但它不起作用。
  2. 服务器端的右花括号 if 语句在 onready 函数之外。它需要嵌套在与开头 if 相同的级别。

试试这个:

$(document).ready(function() //when DOM is ready, run containing code
{
  <% if (grvTimeSheets.EditIndex > -1) {%>
      var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
      $(id).change(function() { 
           $(id).block({ message: null }
        }); 
 <% } %>
}
);

如果它不起作用,请继续粘贴生成的 javascript。

于 2008-11-07T14:54:19.560 回答
1

我使用Page.ClientScript属性注册了一个脚本块以包含我需要使用 jQuery 访问的任何 ID。

这是我在外部文件中的 JavaScript 示例:

var myFancySelector = '#' + myControlId;
selectedValue = $(myFancySelector).val();

myControlId 是从后面的代码中定义的,并在 ClientScriptBlock 中注册。

于 2008-11-07T17:04:27.923 回答
1

用这个:

cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)

不创建脚本标签是错误的,因为您包含它们。MSDN 文档在解释标志的方式上是错误的。

此外,只需将控件的客户端 ID 与后面的代码(而不是jQuery代码)放在单独的变量中。

然后在 jQuery 代码中使用包含 id 的变量。

于 2008-11-07T17:13:05.863 回答
1

在您在后面的代码中创建的脚本块内:

string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId  "';") + "</script>"

我没有验证这个语法,但它应该很接近。您可以自己添加附加语法grvTimeSheets.ClientID。如果你得到这个工作,那么你可能想要改变它来构建一个 JavaScript 数组并以这种方式存储 ClientId,然后你只有一个需要使用的全局 JavaScript 变量。

于 2008-11-07T17:31:52.893 回答
1

另一种选择是只为您正在寻找的元素提供描述其行为的类名。然后你的 jQuery 代码变得非常清晰:

$(function() {
    $("select.yourMarkerClass").change(....);
});

如果没有编辑行,则此代码不执行任何操作。如果存在与选择器匹配的元素,您将获得添加的新行为。

于 2008-11-07T17:34:26.600 回答
1

如果您没有在页面的其他地方使用相同的 ID,则可以使用 jQuery 的高级选择器之一来阻止ASP.NET的 UniqueID:

$('[id$=ddlClients]')

这仅匹配 id 字符串的结尾而不是整个字符串。请记住,如果控件在不同的行中多次出现,这将匹配所有实例。

有关更多示例,请参见选择器。

于 2008-11-07T17:34:30.080 回答
0

密钥可以是您想要的任何东西,但它应该是唯一的。

于 2008-11-07T17:24:13.563 回答
0

周末后我会尝试更多。不过,这是代码:

DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
    csm.RegisterStartupScript(cstype, csname1, script, false);
于 2008-11-07T17:28:12.683 回答
0

因为你在每一行都有一个下拉菜单。每个下拉菜单都有一个唯一的 ClientId,所以我建议按照 Ben 的建议进行操作并使用类选择器,因为它是最简单的解决方案。

或者,您可以在编辑单击时创建一个 JavaScript 函数,然后在正在编辑的那一行中获取下拉列表的唯一客户端 ID。

抱歉,我应该仔细阅读您的代码。

于 2008-11-07T18:03:18.400 回答