回发和 ScriptManager.RegisterStartupScript 不工作的问题

问题描述 投票:0回答:1

我正在使用 ASP.net,后面带有 VB.net 代码。

页面成功使用 ScriptManager.RegisterStartupScript 从多个 asp:DropdownList OnSelectedIndexChanged 事件执行 Javascript 函数。每个下拉列表都有属性 AutoPostBack="True"。在这些情况下,背后的代码和 ScriptManager 都可以完美执行。

我需要添加 (3) asp:RadioButtons。每个都使用 OnCheckedChanged 并使用 AutoPostBack="True" ,如下拉菜单。与 DropDown 不同,除了 ScriptManager 之外,后面代码中的所有代码都按预期执行。它似乎是唯一始终失败的事情,并且在 RadioButton 和 OnCheckChanged 的组合上总是失败。

我尝试将 ScriptManager 的位置从代码的最后一个元素更改为第一个元素。尝试删除除 ScriptManager 之外的所有代码,但仍然失败。

我将我的 javascript 函数绑定到一个按钮,这样在页面呈现后,我可以确认我的函数是否有效。确实如此。

我尝试添加 onclick 事件。让它直接调用函数并返回。它可以运行 javascript,但不会运行后面的 OnCheckedChange 代码。看起来像这样:

<asp:RadioButton runat="server" ID="radApptN" value="A" GroupName="radAppt" text=" Add New" AutoPostBack="true" checked="true" onclick="return gotoCalView();" OnCheckedChanged="radAppt_OnChanged" />

如果我将脚本调用放入 Body Onload 中,它可以工作,但是,我不希望它一直触发。

认为这可能与 PostBack 处理不与 OnSelectedIndexChanged 相同有关。我尝试了以下方法。没成功。

Page.ClientScript.RegisterStartupScript(me, me.GetType(),"CallView","window.onload = function(){ gotoCalView(); }",true)

这不应该像放入 Body Onload 调用一样工作吗?

阅读示例文章后,有很多关于使用更新面板的问题。我不在这个页面。

有什么建议可以尝试但我可能错过了?感觉就像撞到了砖墙。

javascript asp.net vb.net postback clientscript
1个回答
0
投票

您必须发布更多代码。

ScriptManger 应始终放置在表单标签之后。

不清楚为什么使用 3 个 RadioButtons 而不是使用 RadioButton 列表?

所以,作为一个简单的标记,我有这个:

<form id="form1" runat="server">

    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>

    <div style="padding:35px">

        <asp:DropDownList ID="cboHotels" runat="server"
            DataValueField="ID"
            DataTextField="HotelName"
            AutoPostBack="true"
            OnSelectedIndexChanged="cboHotels_SelectedIndexChanged"
            >
        </asp:DropDownList>

        <asp:RadioButton ID="RB1" runat="server" 
            Text="RB1" GroupName="BT" AutoPostBack="true"
            OnCheckedChanged="RB1_CheckedChanged"
            />
        <asp:RadioButton ID="RB2" runat="server" 
            Text="RB2" GroupName="BT" AutoPostBack="true"
            OnCheckedChanged="RB2_CheckedChanged"
            />

        <asp:RadioButton ID="RB3" runat="server" 
            Text="RB3" GroupName="BT" AutoPostBack="true"
            OnCheckedChanged="RB3_CheckedChanged"
            />

        <script>

            function myfun(sValue) {
                alert('this is the client side script from ' + sValue)
            }

        </script>
    </div>
</form>

背后的代码是这样的:

(请记住,页面加载总是在事件代码运行之前运行。甚至在使用更新面板时也是如此。

因此,一如既往,任何设置代码、组合框加载代码等当然都必须放置在“如果不是回发”代码存根中。如果我每次都说出加载组合框的代码,那么我每次都会丢失用户在组合框中的选择。

所以,背后的代码是这样的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        cboHotels.DataSource =
            MyRst("SELECT ID, HotelName FROM tblHotelsA ORDER BY HotelName")
        cboHotels.DataBind()
        cboHotels.Items.Insert(0, New ListItem("Select Hotel", "0"))
    End If

End Sub

Protected Sub RB1_CheckedChanged(sender As Object, e As EventArgs)

    Dim sJava As String = "myfun('RB1')"
    ScriptManager.RegisterStartupScript(Page, Page.GetType, "myftest", sJava, True)

End Sub

Protected Sub RB2_CheckedChanged(sender As Object, e As EventArgs)

    Dim sJava As String = "myfun('RB2')"
    ScriptManager.RegisterStartupScript(Page, Page.GetType, "myftest", sJava, True)

End Sub

Protected Sub RB3_CheckedChanged(sender As Object, e As EventArgs)

    Dim sJava As String = "myfun('RB2')"
    ScriptManager.RegisterStartupScript(Page, Page.GetType, "myftest", sJava, True)

End Sub

Protected Sub cboHotels_SelectedIndexChanged(sender As Object, e As EventArgs)

    Dim sJava As String = "myfun('Combo box')"
    ScriptManager.RegisterStartupScript(Page, Page.GetType, "myftest", sJava, True)

End Sub

现在的结果是这样的:

到目前为止,根据您提供的内容,如上所示,效果很好。

因此,我不得不假设我们在这里缺少一些额外的细节,或者这里可能正在使用更新面板?

© www.soinside.com 2019 - 2024. All rights reserved.