gpt4 book ai didi

javascript - 为什么 asp 页面加载事件在 javascript window.close 上再次触发?

转载 作者:行者123 更新时间:2023-11-28 14:53:12 24 4
gpt4 key购买 nike

我有一个计划,我们使用外部机构提供的培训视频和考试来升级新法规的培训。最后包括考试。

我被要求将其转移到我们的 ASP 员工网站中,我基本上成功做到了这一点。我确实想捕获考试结果,因此,尽管我的 Javascript 技能很初级,但我确实在 Javascript 编码中找到了计算考试结果的位置,因此我让 Javascript 打开一个 asp.net 页面作为弹出窗口,将考试分数信息传递到该页面,该页面将结果记录在数据库中。页面上唯一的项目是确认信息已记录、显示捕获的信息,以及用于关闭弹出窗口的按钮(该按钮会触发 Javascript window.close 事件)。当按下按钮时,分数将再次记录,这应该只发生在页面加载事件中。

我们在数据库中获取了重复的条目,但条目上的时间戳不相同,因此我知道部分代码正在再次运行。

这是该弹出窗口的 asp 标记:

<body>
<form id="form1" runat="server">
<div>
<h4><asp:Label runat="server" ID="lblWelMess" /></h4>
<br />
<br />
<asp:Button runat="server" Text="OK" ID="btnOK" />
</div>
</form>

这是背后的 Visual Basic 代码 -

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim quizName As String = Request.QueryString("qn")
Dim corrAns As Integer = CInt(Request.QueryString("ca"))
Dim totQues As Integer = CInt(Request.QueryString("nq"))
Dim examStatus As String = Request.QueryString("xst")

logScores(quizName, examStatus, corrAns, totQues)

End Sub

Protected Sub logScores(ByVal qName As String, xStat As String, correct As Integer, qNum As Integer)
Dim uID As String = Session.Item("USERNAME")
Dim uName As String = Session.Item("FULLNAME")
Dim testPerc As String = Format(100 * correct / qNum, "0.00")

Dim connSQL As New SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionString1").ToString)
Dim procName As String = "AddExamScore"
Dim cmdAdd As New SqlCommand(procName, connSQL)
cmdAdd.CommandType = CommandType.StoredProcedure
cmdAdd.Parameters.AddWithValue("UserID", uID)
cmdAdd.Parameters.AddWithValue("corrAns", correct)
cmdAdd.Parameters.AddWithValue("numQues", qNum)
cmdAdd.Parameters.AddWithValue("corrPerc", CDec(testPerc))
cmdAdd.Parameters.AddWithValue("status", xStat)
cmdAdd.Connection.Open()

cmdAdd.ExecuteNonQuery()
cmdAdd.Connection.Close()

lblWelMess.Text = uName & ", your score has been logged" & "<br />Quiz: " & qName & "<br />Status: " & xStat & "<br />Correct: " & correct.ToString & "<br />Questions: " & qNum.ToString & "<br />Percentage: " & testPerc
End Sub

Protected Sub btn_OK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Response.Write("<Script language=javascript>window.close()</Script>")
End Sub

我应该关闭该窗口还是以其他方式构造按钮单击事件?

我是否应该在“logScores”子例程中包含某种代码来检查以确保它不会因窗口关闭而触发?

我应该移动“logScores”子项以触发不同的事件吗?

最佳答案

大多数 ASP.NET Web 窗体控件都会导致回发,例如当您单击按钮时。这会强制页面重新加载。您可以检查它是否是回发,但这很愚蠢。为什么需要回发来关闭页面?为什么需要服务器控件?

相反,让我们替换所有这些:

<asp:Button runat="server" Text="OK" ID="btnOK" />

Protected Sub btn_OK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Response.Write("<Script language=javascript>window.close()</Script>")
End Sub

这样:

<button onclick="window.close()">OK</button>

不同之处在于,您原来的方式会触发一些 JavaScript,这会导致向服务器发送 HTTP Post,运行整个页面生命周期,构建页面的新实例,运行按钮单击处理程序,编写一些 JavaScript一旦点击该 JavaScript,该页面将导致其关闭窗口。

我的方式可以描述为:当单击按钮并关闭窗口时,会触发一些 JavaScript。

<小时/>

注意,像这样的东西就是为什么像我这样的人如此不喜欢 Web 表单。它可能看起来很简单,但发生的一切比看起来要复杂得多。相反,学习 HTML 和 JavaScript 的基础知识会给你带来更好的帮助。最好使用 ASP.NET MVC,它可以减少这种抽象泄漏的情况。或者切换到仅在客户端上编写 HTML 和 JavaScript(可能使用 Angular、React 或 Knockout 等),通过 AJAX(可能使用 ASP.NET Web API)或 Web 套接字(可能使用 SignalR)与 Web 服务器通信。这意味着更少的抽象泄漏、更清晰的 HTML、更容易调试、更快的客户端速度、更少的客户端和服务器资源密集型。

我并不是说您不能使用 Web 表单并取得成功。就像罗斯的回答所示,做事通常有一种方法。但还有更好的方法。

关于javascript - 为什么 asp 页面加载事件在 javascript window.close 上再次触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43807033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com