0

全部,

环境: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" <- 也是我在 $find() 函数中使用的),因为我在同一页面上有许多此控件的实例。

我查看了呈现的代码,我可以看到创建行为的 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,不显示时无法访问,显示时已经晚了,因为它显示在错误的位置。

4

2 回答 2

4

问题的原因是您在页面完成组件初始化之前尝试查找组件。尝试在 Sys.Application.add_load 事件处理程序中访问您的编辑器。我尝试了以下代码,一切正常:

<script type="text/javascript">
    Sys.Application.add_load(function() {
        var obj = $find("myID");
        alert(obj);
    });
</script>

编辑: 解决您的最新问题:如何重新定位它。Callout ValidatorCalloutExtender 使用 PopupExtender 来显示它。因此,您可以尝试绑定到弹出扩展器的“显示”和“显示”事件,然后尝试重新定位标注。

<script type="text/javascript">
    Sys.Application.add_load(function() {
        var callouotComponent = $find("myID");
        var popupBehavior = callouotComponent._popupBehavior;

        popupBehavior.add_showing(function(){alert("I am showing");});
        popupBehavior.add_shown(function(){alert("I was shown");});
    });
</script>

注意:我没有验证此代码,但它可以用作起点。

于 2012-10-25T19:43:27.200 回答
1

修改您的代码并验证,弹出位置正在改变。

<script type="text/javascript">
    Sys.Application.add_load(function () {
      var callouotComponent = $find("myID");
      //Below line is to init popup ballon, otherwise popup behaviour will return null
      callouotComponent._ensureCallout();
      var popupBehavior = callouotComponent._popupBehavior;
      popupBehavior.set_x(100);
      popupBehavior.set_y(100);
    });

</script>
于 2014-03-06T05:35:53.430 回答