Onclick 和数据目标

Onclick and data-target

提问人:BrianON 提问时间:8/18/2023 最后编辑:Joel CoehoornBrianON 更新时间:9/8/2023 访问量:85

问:

我正在使用 asp。我有一个按钮,可以打开一个模式来编辑食谱。模态出现,但它没有调用我想通过单击激活的函数。

我试过这两行:

<!---<asp:Button ID="btnEditar" runat="server" CssClass="btn btn-block" Text="EDITAR" OnClick="btnEditar_Click" data-toggle="modal" data-target="#exampleModal1" />--->
<button type="button" class="btn btn-block" data-toggle="modal" Width="200px" runar="server" OnServerClick="btnEditar_Click" data-target="#exampleModal1" >EDITAR</button>

在代码中:

Protected Sub btnEditar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim var1 = "TemperaturaProducto"
        Dim var2 = "TemperaturaCamisa"
        Dim var3 = "VelocidadAgitacion"
        Dim var4 = "IntensidadAgitacion"
        Dim var5 = "Tiempo"
        Dim var6 = "FindePaso"
        Dim constr As String = ConfigurationManager.ConnectionStrings("RECETAConnectionString").ConnectionString
        Dim query As String = "select * from " & Module1.Rnom.ToString & "_V" & Module1.verc.ToString

        Using con As New SqlConnection(constr)
            Using cmd As New SqlCommand(query)
                Using sda As New SqlDataAdapter()
                    cmd.Connection = con
                    sda.SelectCommand = cmd
                    Using ds As New DataSet()
                        sda.Fill(ds)
                        var1 = ds.Tables(0).Rows(0)(var1).ToString
                        var2 = ds.Tables(0).Rows(0)(var2).ToString
                        var3 = ds.Tables(0).Rows(0)(var3).ToString
                        var4 = ds.Tables(0).Rows(0)(var4).ToString
                        var5 = ds.Tables(0).Rows(0)(var5).ToString
                        var6 = ds.Tables(0).Rows(0)(var6).ToString
                        'grupo = ds.Tables(0).Rows(0)("Grupo").ToString
                        'Config.usuario.Value = Config.Equals[]
                        'Context.Items.Add("usuario", usuario)
                        'Module1.usuario = usuario

                        'GridView1.DataSource = ds.Tables(0)
                        'GridView1.DataBind()
                        'GridView1.DataSource = ds.Tables(1)
                        'GridView1.DataBind()

                    End Using
                End Using
            End Using
        End Using

        txtTempProd.Text = var1
        txtTempCam.Text = var2
        txtVelAgi.Text = var3
        txtIntAgi.Text = var4
        txtTiempoMinutos.Text = var5
    End Sub

我的目的是在激活功能时模态不会消失。

HTML asp.net vb.net

评论

0赞 BrianON 8/18/2023
我认为问题是在执行函数后,站点主服务器再次启动,因此它删除了模式。我找不到不再次运行站点主数据的方法。
0赞 Andrew Morton 8/19/2023
什么用于显示模式对话框?您可能会发现,在提供数据的服务器上创建服务,并在客户端中使用 AJAX 查询该服务以填充对话框会更简单。(此外,对于生产代码,应避免在 SQL 查询中使用:按照您希望检索的顺序为它指定列名 - 数据库可以随时以它喜欢的任何顺序自由返回列。*
0赞 Joel Coehoorn 8/19/2023
神圣的SQL注入问题,蝙蝠侠。

答:

1赞 Albert D. Kallal 8/19/2023 #1

首先,你不要展示、提及或分享你正在使用的模态对话系统。(并且有大量的船只可供选择)。

此示例代码假定 jQuery,并且 jQuery.UI 已安装且可用。

当然,问题是如果你有一个按钮,当点击它时会弹出一个对话框?好吧,如果你然后回发运行一些服务器端代码,那么你会得到一个全新的网页重新加载,因此你的对话框弹出窗口将消失。

然后是第二种情况,您有一个弹出对话框,然后单击该对话框中的 asp.net 按钮(服务器端按钮)。再一次,当你点击这样的按钮时,你再次得到一个回发,因此结果再次是整个浏览器重新加载,因此,任何弹出对话框都将再次关闭。在某些情况下,您可能希望对话框保持打开状态。

所以,这里有 2 种不同的情况。 但是,让我们来看看第二种情况。 所以,逻辑:

单击一个按钮(服务器端)。 加载并获取一些数据 - 填写一些控件,然后弹出对话框。

在此示例中,让我们使用组合框来代替按钮单击。 它将回发。(就像点击按钮一样)

然后,我们使用代码加载控件,然后弹出对话框。

因此,我们的标记将有一个下拉列表(用于选择酒店)。

该标记:

        <h3>Select Hotel to Edit</h3>

        <asp:DropDownList ID="cboHotel" runat="server"
            DataValueField="ID"
            DataTextField="HotelName"
            AutoPostBack="true"
            OnSelectedIndexChanged="cboHotel_SelectedIndexChanged" 
             Width="261px"                
            >
        </asp:DropDownList>

在我们的页面加载事件中,我们加载上面的组合框

此代码:

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

    If Not IsPostBack Then
        ' this is the REAL first page load
        ' load up default controls, combo box etc.

        Dim strSQL As String =
            "SELECT ID, HotelName FROM tblHotelsA 
            ORDER BY HotelName"

        cboHotel.DataSource = MyRst(strSQL)
        cboHotel.DataBind()
        cboHotel.Items.Insert(0, "Select Hotel")

    End If

End Sub

好的,这样就可以处理我们的组合框了。

因此,在组合框的正下方,让我们添加一个“div”区域,并放入一堆控件。这可能是你的例子,或者其他什么。

但是,无论我们放入此“div”区域的内容,都将是我们的弹出区域。

因此,说一些控件来编辑酒店,如下所示:

        <br />
        <br />
        <div id="editarea" style="display: none" class="Ebox">

            <div style="float: left" class="iForm">
                <br />
                
                <label>Hotel Name</label>
                <asp:TextBox ID="txtHotel" runat="server" Width="280"></asp:TextBox>
                <br />

                <label>City</label>
                <asp:TextBox ID="tCity" runat="server" f="City" Width="140"></asp:TextBox>
                <br />

                <label>Province</label>
                <asp:TextBox ID="tProvince" runat="server" Width="75"></asp:TextBox>
                <br />

            </div>
            <div style="float: left; margin-left: 20px" class="iForm">
                <label>Description</label>
                <br />
                <asp:TextBox ID="txtNotes" runat="server" Width="400" TextMode="MultiLine"
                    Height="130px" f="Description"></asp:TextBox>
                <br />
                <asp:CheckBox ID="chkActive"  runat="server" style="margin-right:5px" /><b>Active</b> 

                <asp:CheckBox ID="chkBalcony" runat="server" style="margin-left:20px;margin-right:5px" /><b>Has Balcony</b>
            </div>
            <div style="clear: both"></div>


            <asp:LinkButton ID="cmdSave" runat="server" CssClass="btn myshadow"
                OnClick="cmdSave_Click">
                        <span class="fa fa-floppy-o fa-lg"> Save</span>
            </asp:LinkButton>


            <asp:LinkButton ID="cmdCancel" runat="server" class="btn myshadow" Style="margin-left: 15px">
                        <span class="fa fa-arrow-circle-left fa-lg"> Back/Cancel</span>
            </asp:LinkButton>

            <asp:LinkButton ID="cmdDelete" runat="server" class="btn myshadow" Style="margin-left: 15px">
                        <span class="fa fa-trash-o fa-lg"> Delete</span>
            </asp:LinkButton>


        </div>

好的,现在我们需要填写上面的控件。 (请注意,在开发过程中,使用 display: normal,并且仅在您拥有所需的布局后,然后作为最后一步,更改编辑区域的样式并使用“display: none”

所以,现在我们的代码来加载控件。(所选组合框更改了索引事件)。

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

    Dim cmdSQL As New SqlCommand("SELECT * FROM tblHotelsA 
                                 WHERE ID = @ID")

    cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = cboHotel.SelectedItem.Value

    Dim rstData As DataTable = MyRstP(cmdSQL)

    Dim OneRow = rstData.Rows(0)

    txtHotel.Text = OneRow("HotelName")
    tCity.Text = OneRow("City")
    tProvince.Text = OneRow("Province")
    txtNotes.Text = OneRow("Description")
    chkActive.Checked = OneRow("Active")
    chkBalcony.Checked = OneRow("Balcony")

    ' now pop the dialog
    Dim sJava As String = "mypop()"

    ScriptManager.RegisterStartupScript(Page, Page.GetType, "my java", sJava, True)


End Sub

我们还需要一个 JavaScript 例程。

因此,在编辑区域 div 之后,我们有以下代码:

    <script>

        function mypop() {

            myDialog = $("#editarea")

            myDialog.dialog({
                autoOpen: false,
                modal: true,
                appendTo: "form",
                closeText: "",
                width:"840px",
                title: "Edit Hotel",
                dialogClass: "dialogWithDropShadow"
            })

            myDialog.dialog('open')
        }

    </script>

因此,效果和结果如下所示:

enter image description here

而且,保存按钮代码看起来?

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

    Dim cmdSQL As New SqlCommand("SELECT * FROM tblHotelsA 
                                 WHERE ID = @ID")

    cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = cboHotel.SelectedItem.Value

    Dim rstData As DataTable = MyRstP(cmdSQL)

    Dim OneRow = rstData.Rows(0)

    OneRow("HotelName") = txtHotel.Text
    OneRow("City") = tCity.Text
    OneRow("Province") = tProvince.Text
    OneRow("Description") = txtNotes.Text
    OneRow("Active") = chkActive.Checked
    OneRow("Balcony") = chkBalcony.Checked

    SaveData(rstData, cmdSQL)


End Sub

那么,仔细看上面?

我使用了一些“辅助”例程。将这些添加到 Module1 的“常规”代码中。这些例程可以一遍又一遍地用于您创建的每个网页。

这些常规例程(例如在 Module1 中)是:

Public Function GetConStr() As String

    Return My.Settings.TEST4
    ' ConfigurationManager.ConnectionStrings("RECETAConnectionString").ConnectionString

End Function



Public Function MyRst(strSQL As String) As DataTable
    ' general get any data from SQL
    Dim rstData As New DataTable
    Using conn As New SqlConnection(GetConstr)
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
            rstData.TableName = strSQL
        End Using
    End Using
    Return rstData
End Function

Public Function MyRstP(cmdSQL As SqlCommand) As DataTable
    ' general get any data from SQL command
    Dim rstData As New DataTable
    Using conn As New SqlConnection(GetConstr)
        Using (cmdSQL)
            cmdSQL.Connection = conn
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        End Using
    End Using

    Return rstData

End Function

Public Sub MyRstPE(cmdSQL As SqlCommand)
    ' General execute sql - no return of data

    Dim rstData As New DataTable
    Using conn As New SqlConnection(GetConStr)
        Using (cmdSQL)
            cmdSQL.Connection = conn
            conn.Open()
            cmdSQL.ExecuteNonQuery()
        End Using
    End Using

End Sub

Public Sub SaveData(rstData As DataTable, cmdSQL As SqlCommand)

    Using conn As New SqlConnection(GetConStr)
        Using (cmdSQL)
            cmdSQL.Connection = conn
            conn.Open()
            Dim da As New SqlDataAdapter(cmdSQL)
            Dim daU As New SqlCommandBuilder(da)
            da.Update(rstData)

        End Using
    End Using

End Sub

所以,代码不多,但这些例程就像“黄金”一样,因为网页上的隐藏代码现在变得非常像在 VB6 中工作,或者像在 MS-Access 中工作一样。将上述设计用于所有代码。

第二部分,以及对话框中的回发

因此,第一部分展示了如何加载一些数据,并显示一个对话框。但是,问题是如何允许标准 asp.net 按钮在弹出对话框中工作,并且不关闭对话框。

简单的解决方案是使用更新面板。更新面板的位置在这里很重要,它应该放在弹出的 div 内部。

所以,这种格式

   div
       update panel
   end div

因此,让我们将组合框移动到该弹出式 div 中。我们删除了在选择酒店时弹出对话框的代码。但是,保存按钮现在将保存数据,因此在保存后,我们清除控件,并将组合框重新设置回“选择酒店”。

保存按钮和组合框将触发回发,但请注意弹出对话框如何保持打开状态。

因此,我们的标记现在变成这样:

一、显示弹窗的按钮

    <div style="padding:35px; margin-left: 40px;">
        <asp:Button ID="cmdShowPop" runat="server" Text="Show Pop"
            OnClientClick="mypop();return false"                
            />

现在,我们将所有以前的标记,包括组合框(下拉列表)移动到内容模板的内部,如下所示

enter image description here

之前的关闭按钮没有代码(但确实导致了关闭对话框的回发)。该按钮代码现在必须关闭对话框,因此是这样的:

<asp:LinkButton ID="cmdCancel" runat="server" class="btn myshadow" 
    Style="margin-left: 15px"
    OnClientClick="$('#editarea').dialog('close');return false;">
    <span class="fa fa-arrow-circle-left fa-lg"> Close</span>
</asp:LinkButton>

结果现在是一个弹出对话框,可以在回传中幸存下来,如下所示:

enter image description here

对组合框代码的更改只是删除了弹出对话框代码,现在是这样的:

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

    Dim cmdSQL As New SqlCommand("SELECT * FROM tblHotelsA 
                                 WHERE ID = @ID")

    cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = cboHotel.SelectedItem.Value

    Dim rstData As DataTable = MyRstP(cmdSQL)
    Dim OneRow = rstData.Rows(0)

    txtHotel.Text = OneRow("HotelName")
    tCity.Text = OneRow("City")
    tProvince.Text = OneRow("Province")
    txtNotes.Text = OneRow("Description")
    chkActive.Checked = OneRow("Active")
    chkBalcony.Checked = OneRow("Balcony")

    '' now pop the dialog
    'Dim sJava As String = "mypop()"
    'ScriptManager.RegisterStartupScript(Page, Page.GetType, "my java", sJava, True)

End Sub

因此,您可以在弹出的 div 中插入一个更新面板,这将防止对话框因标准按钮回发而关闭。唯一的附加部分是有一个关闭按钮来关闭对话框,如上所述。