我在这里读过类似的标题问题,但他们遇到的行为并不完全相同。请不要链接到类似的问题,如果您仔细阅读,这个问题会略有不同。
我有动态创建的这些控件。它们没有硬编码ID。
对于这些控件中的每一个,我想要在更改值时触发脚本。 控件都是下拉列表。这是我加载页面时的代码隐藏:
foreach (string param in hasDependencies.Keys)
{
ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}
进入此循环的第一个控件完美运行。如果我更改下拉列表的值,则脚本每次都按预期执行。对于先进入此循环的控件,每次更改其下拉值时,脚本都会触发并完美执行。
但是,其他控件不会触发脚本。当我更改其他下拉列表的值时,脚本根本不会执行,甚至不会尝试执行脚本。
当我调试时,我可以看到每个控件实际上都进入了这个循环,我可以告诉它它是控件的正确ID,但无论第一个控件绑定什么,其他控件都没有。 我也试过“开”和“改变”而不是“绑定”,没有区别。
我确信人们会希望看到脚本本身,但问题可以与C#代码隔离开来。 JS控制台中没有任何内容,开发人员工具中页面上的标记没有任何值得一看,只是一堆硬编码的敏感无关信息,我显然无法分享。这个问题可以与C#代码隔离开来,因为即使我用非常简单的东西(例如简单的警报)替换dynamicScript,它也只适用于第一个控件。
答案 0 :(得分:1)
添加此作为答案(澄清我的评论),因为将其置于评论中会很困难。如果它没有解决它,请告诉我,我将删除它。
此代码:
foreach (string param in hasDependencies.Keys)
{
ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}
这部分是添加一个事件监听器(监听改变并做一些事情),而不是一个函数调用(做一些改变):
"$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});"
应该是
foreach (string param in hasDependencies.Keys)
{
ScriptManager.RegisterStartupScript(this, GetType(), "onChange", dynamicScript, true);
}
或
foreach (string param in hasDependencies.Keys)
{
ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "function(){"+dynamicScript+"}", true);
}
这样它就可以在onchange上运行你的动态脚本而不只是添加另一个更改事件监听器。
这有意义吗?
旁注为了将来参考,编写像$('#MainContent_JenkinsField_[redacted]')
这样的代码可能会让您的问题进一步混淆,因为[]
可以成为jQuery的一部分选择。如果从字面上理解,该选择器将查找ID为MainContent_JenkinsField_
且具有名为redacted
的属性的元素。我希望括号只是为了显示你删除了param的位置,真正的选择器看起来像这样:$('#MainContent_JenkinsField_yourParam')
答案 1 :(得分:0)
以下是问题所在:
foreach (string param in hasDependencies.Keys)
{
ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}
RegisterStartupScript需要5个参数,第3个参数是键。对于我试图绑定的每个事件监听器,我给出了关键字" onChange"每次。关键需要是独一无二的。
foreach (string param in hasDependencies.Keys)
{
ScriptManager.RegisterStartupScript(this, GetType(), "onChange" + param, "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}
我改变了
"的onChange"
到
"的onChange" + param
固定。