【发布时间】:2012-10-06 19:52:39
【问题描述】:
全部,
环境:ASP.NET 2.0,AjaxToolkit build 1.0.20229.0,IE9
我正在使用 $find() 来查找调用扩展器的行为,因此我可以使用 .show() 方法显式显示。不幸的是,$find() 返回 null。
$find('my auto generated behvaiour Id').show();
仅供参考:ValidatorCalloutExtender 上的 BehaviorID 是使用控件的 ClientID 生成的(ClientID_ + "BehaviourID"
我查看了呈现的代码,我可以看到创建行为的 JS:
Sys.Application.add_init(function() {
$create(AjaxControlToolkit.ValidatorCalloutBehavior ...
$find() 在 UpdatePanel 中的回发之后执行并始终返回 null。
编辑(添加): 我创建了新页面,下面是代码,find() 返回仍然为空,- ASP.NET 2.0 的 Ajax 控件中是否存在错误?
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScripManager1" runat="server" EnablePageMethods="True" >
</asp:ScriptManager>
<asp:TextBox runat="server" ID="txtInputField" />
<asp:RequiredFieldValidator runat="server" ID="valInput"
ControlToValidate="txtInputField"
ErrorMessage="ERROR STRING"
Display="none" /> <ajaxToolkit:ValidatorCalloutExtender runat="server" ID="extValInput" TargetControlID="valInput" BehaviorID="myID" />
<asp:Button runat="server" ID="btn" OnClick="btn_click" CausesValidation="True" />
<script type="text/javascript">
var obj = $find("myID");
alert(obj);
</script>
</form>
添加: 在 JS 调试器中观察后,我意识到验证器标注扩展器仅在出现错误时才会出现(动态添加到 DOM 中),因此,如果没有错误,则找不到它。
现在的问题是:如何在显示之前重新定位调出扩展气球?真的是catch 22,不显示的时候访问不了,显示的时候已经晚了,因为显示的地方不对。
【问题讨论】:
-
为什么你决定扩展器组件的 id 由 control + BehaviorID 的 ClientID 生成?如果你为扩展器指定了 BehaviorID 属性,你应该在 $find 方法中使用它作为组件 ID。
-
因为它是一个可以在页面上多次出现的用户控件,这意味着如果我设置 BehaviorID = 'myID',它就不会是唯一的。尽管如此,我创建了一个简单的页面,包括 ValidatorCalloutExtender,分配了一个唯一的行为 ID,而 $find('assigned behavior ID') 仍然没有找到它。框架中一定有一个错误。我正在使用 ASP.NET 2.0,用于 ASP.NET 2.0 的 Ajax 工具包。
-
在 JS 调试器中观察后发现,validator callout 扩展器只有在出现错误时才会出现(动态添加到 DOM 中),因此如果没有错误则找不到。
-
我完全尝试了您的代码,如果我将您发布的 javascript 放在窗口加载事件中,它确实会找到它。这意味着您尝试访问它的时间很重要,因为它可能尚未创建。
-
您使用的是什么版本的 asp.net 和工具包?在 asp.net 2.0 和最新版本的 asp.net 2.0 工具包中,IE9 不起作用。
标签: javascript asp.net ajaxcontroltoolkit behavior extender