0

我需要在插入之前检查数据库中的重复数据,如果检测到重复数据,请让用户选择继续保存操作或更改正在保存的内容并重试。我试过使用Windows.Forms.MessageBox.Show,但我发现这对我想做的事情不起作用。过了一会儿,我找到了这段代码

If Not Page.ClientScript.IsStartupScriptRegistered(Me.GetType(), "confirm") Then Page.ClientScript.RegisterStartupScript(Me.GetType, "confirm", "confirm('" & Message & "');", True) End If

从这篇文章Call javascript from vb.net code behind并试一试。但我永远无法进入要显示的确认对话框。我试图使用构建消息字符串String.Concat()并将其与调用一起传递,但它仍然无法正常工作,所以我最终取出构造的字符串并用硬编码的字符串替换它。在那之后,我能够得到要显示的消息。但是发生的情况是,在方法中的所有行都已执行后显示对话框。我需要能够在代码执行期间显示此消息,并且我需要能够使用从它返回的值进行进一步处理。谁能帮我解决以下问题:为什么只有在执行代码后才会显示对话框?如何构建和显示确认对话框中显示的字符串?

4

1 回答 1

0

为什么只有在代码执行后才显示对话框?

因为你不了解 web 和 asp.net 是如何工作的。

您背后的代码 CAN NOT 、 DOES 和 NEVER 直接与用户交互。

您在网站中的代码仅在用户执行操作后运行,并且网页传输到服务器。后面的代码只能修改网页 - 不能与用户交互。当您的所有代码都完成后,整个网页现在被发送回最终用户。结果,如果您的代码停止、等待或停止,则网页仍然卡在服务器上。

只有在您的代码运行并且整个页面被发送回客户端之后,浏览器才会重新加载重新绘制,现在网页又回到了客户的台式计算机上。网络服务器?

它炸毁,炸毁并破坏表单变量,破坏网页,现在网络服务器正在等待桌面上有一些网页的 20 个用户中的任何一个。Web 服务器没有加载 20 个不同的页面。

Web 服务器没有 20 组变量。NOTHING 存在服务器端。

现在,当 20 个用户中的一个点击他们网页上的按钮时?

它被张贴,或传送到网络服务器。Web 服务器处理传入的网页,加载正确的网页。该网页中的所有代码和变量的值和更重要的是重新创建。他们每次都开始。(否则一台 Web 服务器将如何处理许多用户?)。我的意思是,你可以在显示器上打字——但你不能让 20 个人来做,对吗?因此,每个请求都是该网页的一个新进程。

现在,您的代码运行(用户在另一端使用 Web 浏览器等待)。当你编码完成,甚至修改一个简单的文本框?最终用户 SITLL 看不到这些更改。何时(并且仅当后面的代码完成时),网页才会完成渲染。然后整个网页现在被发送回客户端(它会覆盖他们正在查看的内容!!!)。

所以,这个所谓的往返看起来像这样:

一个网页位于他们的用户桌面上。所以你有这个:

在此处输入图像描述

注意非常小心 - 服务器端没有加载任何网页。您的文本框和后面的 C#/vb.net 代码甚至都没有加载!!!- 不存在值或变量!!!

所以用户说点击一个按钮。

所以会发生这种情况:

在此处输入图像描述

因此,该页面已发布 - 在 Web 服务器上运行。

所以现在我们有了这个:

在此处输入图像描述

所以 Web 服务器现在可以获取正确的网页。它加载,该页面中的所有代码和变量都是从头开始重新创建的!!!

然后,只有这样,后面的代码才开始运行。该代码可以修改文本框,做任何事情。但是,这里可能会发生与用户的零交互。

现在,后面的代码没有办法停止或等待用户输入。该代码只能运行,并且只能修改页面 - (用户网页没有改变,他们看不到任何代码运行,即使您修改文本框等,用户也看不到这些更改)。

现在,当您的所有代码完成对网页进行更改时?

然后网页现在发送回给用户。

在此处输入图像描述

浏览器现在重新加载整个页面!!!(它通常看起来不像,但现在重新创建了整个页面)。

在服务器端?该网页现在被扔掉,从内存中删除,您在代码中拥有的所有变量都被销毁并从内存中删除。Web 服务器现在已准备好处理从您的众多用户中的任何一个发布的任何新网页。

所以,你不能停止代码并等待输入,对吗?

我的意思是,比如说在桌面上,我们有一个按钮和两个文本框。当我们单击按钮时,我会询问您 TextBox1 的值,然后是 TextBox2 的值。

我们有这个:

在此处输入图像描述

我们可以用这个提示(并有代码 HALT/WAIT):

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    ' ask for Text Box 1 value

    TextBox1.Text = InputBox("Enter Value for Text box 1")

    TextBox2.Text = InputBox("Enter value for Text box 2")

End Sub

所以,当我们运行时,我们会得到:

在此处输入图像描述

因此,代码暂停,等待输入,然后被推入文本框。

但是,现在,让我们在网络上尝试一下。

按钮,两个文本框是这样的:

在此处输入图像描述

所以,我现在可以双击按钮并编写以下代码:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    TextBox1.Text = "hello"

End Sub

现在,上述工作,因为整个页面已发布。

现在让我们说我想“确认”上面的按钮。在我将文本设置为 hello 之前询问用户?

好吧,我不能用后面的代码来做到这一点。并重新查看上面的图形图像。然后复习 100 次,直到你掌握了这一点。你必须掌握回传或所谓的往返概念。

那么,我们该如何提示呢?好吧,让我们做一个简单的想法。

提示用户交互?我们不能在后面使用代码!!!

所以,我能为按钮做的是:

我们必须引入客户端代码——我们必须从客户端获取用户输入——我们不能使用后面的代码!!!

所以,我可以这样做:

        <asp:Button ID="Button1" runat="server" Text="Button" Width="85px"
            OnClientClick="return myask();"  />

        <script>
            function myask()
            {
                return confirm("Do you want hello in the text box?")
            }
        </script>

所以按钮和以前一样,但我们现在提示。当我们在网页上运行时,我们得到:

在此处输入图像描述

所以我们在客户端运行代码——此时服务器甚至可以被拔掉。我们没有发回按钮点击。

现在事实证明,如果你将一个按钮放到网页中,然后连接一个客户端事件,你可以将 OnClientClick 添加到上面!!!!如果您返回 true,则按钮单击会触发,如果您返回 false,则按钮单击不会触发。

所以再次注意,我们不能编写或创建服务器端循环来一遍又一遍地提示。但是,我们可以创建一个客户端!!!!

但是,既然我们无论如何都必须显示该信息?然后在网格中显示信息,每行都有一些复选框,用户点击每个复选框,然后有一个提交,你接受或拒绝一个镜头中的所有选择。

如果您不执行上述操作(这对您的用户来说痛苦和痛苦要少得多),那么您真的需要为每个选择提供提示/是/否吗?您仍然必须打包代码、打包标记、打包信息并将其发送到客户端。如前所述,这是由于 NEVER 背后的代码与用户交互 - 但只能对网页进行更改。并且只有在网页在服务器上由后面的代码处理时才进行更改。

因此,代替一系列是/否提示(这将折磨您的用户至死),您需要获取该数据或任何有问题的数据。在某个网格中渲染它,然后将整个东西发送到客户端。那时,他们可以使用 UI 来做出选择,然后并且只有这样,您现在才能将这些许多选择传回服务器。

那么,假设我想处理一些记录?

由于我不能使用服务器端循环,暂停代码,提示用户?

好吧,那么我想我可以翻页所有信息,将其发送到浏览器,然后循环/询问用户。但是对于那些是/否的响应,您仍然必须将所有信息发送到客户端。

因此,您最好显示信息 - 添加一些复选框行,例如网格:

    <div style="width:40%;padding:25px">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID" 
            CssClass="table">
            <Columns>
                <asp:BoundField DataField="Firstname" HeaderText="Firstname"  />
                <asp:BoundField DataField="LastName" HeaderText="LastName"  />
                <asp:BoundField DataField="City" HeaderText="City"  />
                <asp:BoundField DataField="HotelName" HeaderText="HotelName"  />
                <asp:BoundField DataField="Description" HeaderText="Description"  />
                <asp:TemplateField HeaderText="Confirm" ItemStyle-HorizontalAlign="Center">
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>

        </asp:GridView>
        <br />
        <asp:Button ID="cmdConfirm" runat="server" Text="Confirm and process" />

因此,要加载的代码可能是这样的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 处理 Me.Load 如果不是 IsPostBack Then LoadGrid() End If End Sub

Sub LoadGrid()

    Dim strSQL As String =
        "SELECT TOP 5 P.ID, P.Firstname, P.LastName, tblHotels.City,
        tblHotels.HotelName, Description FROM People AS P
        LEFT JOIN tblHotels ON P.Hotel_ID = tblHotels.ID"

    GridView1.DataSource = MyRst(strSQL)
    GridView1.DataBind()

End Sub

我们现在有了这个:

在此处输入图像描述

所以现在代替说 5 是/否/确认提示。我们将整个交易发送到浏览器。用户可以选择要处理或确认哪些记录,我们有一个按钮。

所以,在网络领域,你必须“打包”你想问的东西。下发给用户。用户做出选择,然后您将整个交易和批次发送回服务器。

实际上,您必须改变编码和 UI 的方法。

事实上,用户经常喜欢网络软件的原因之一是什么?

因为开发人员不能折磨他们来处理无数的是/否提示 - 它甚至不可能。结果,开发人员现在必须花费额外的时间,并设计一个 UI 允许用户轻松做出所有这些是/否的选择,实际上必须先呈现选择,然后让用户做出他们的选择,然后在一个按钮中,您将这些选择发送回服务器端进行处理。

这不仅可以防止对人类的折磨和虐待,而且无论如何也倾向于带来更好的用户体验。

所以,不要'用棒球棒敲打和虐待你的用户,不要通过循环中的一大堆是/否提示来不断地敲打和伤害你的用户。你的用户会更快乐,人类和人类都会更快乐,而你所有人都被迫做一些额外的工作,这样你就不会用所有这些提示来滥用和伤害你的用户——这是你不切实际的随便做!!!

因此,在上面,要处理选定的选项行,然后是按钮后面的代码:

Protected Sub cmdConfirm_Click(sender As Object, e As EventArgs) Handles cmdConfirm.Click

    ' process each row of grid - get check box rows only

    For Each gRow As GridViewRow In GridView1.Rows
        Dim ckBox As CheckBox = gRow.FindControl("CheckBox1")

        If ckBox.Checked Then
            ' get PK row 
            Dim pkID As Integer = GridView1.DataKeys(gRow.RowIndex).Item("ID")
            ' do whatever based on PK row ID from database
            Debug.Print("To process ID = " & pkID)
        End If

    Next
End Sub

所以,请注意备份 - 我们可以向一个按钮引入一个“确认”,表示将删除数据等。我们可以“拦截”一个按钮单击以提示 JavaScript 确认执行(单击)按钮,或者不基于那个对话。

但是,我们不能做的是运行一些循环服务器端,并暂停代码,并在该循环中提示服务器端代码(由于代码背后的运行方式的性质 - 它从来没有真正与用户直接交互桌面软件。它只能在用户完成某些操作后进行交互,然后将整个网页发布回服务器,以便后面的代码运行和处理用户在该网页上所做的事情。

现在,理论上可以在 100% 的客户端软件 (JavaScript) 中循环并提示是/否。但这会迫使您一次性将所有选择发送到浏览器以进行该处理。既然我们必须“收集”所有的选择信息?然后如上所示,不妨构建一些网格或其他类型的 Web UI,以同时呈现所有选项,因为无论您选择哪种解决方案,这些选项都将涉及将选项 DOWN 发送到客户端以供用户使用选择/选择,然后回发到服务器以获取处理这些选择的代码。

于 2021-12-02T02:37:59.283 回答