繁体   English   中英

用ajax调用代码隐藏函数?

[英]Call a code-behind function with ajax?

搜索了一下,找不到明确的答案。

我有一个很大的HTML表格,里面有数字。 我有一个选择器(radiobuttonlist),如果用户希望以$或天为单位查看该表,可以单击该选择器。

现在它可以正常工作,但是页面会刷新,因为每次用户单击两个单选按钮之一时,我都会调用代码隐藏函数(RefreshTable),因为它会更改格式并需要由RefreshTable函数完成新的计算

有什么方法可以调用该函数而无需使用Ajax或其他刷新页面? 该函数只有一个参数:ProjectID,它是在VB.NET中编码的,我们使用的是ASP.NET

这是.ASPX页面上的表代码,它只是外壳程序,所有内容都是通过更改RadioButton(autopostback = true)时调用的VB.NET方法添加的,因此我们检查选择了哪一个并执行VB.NET方法填充表格。 (功能代码如下)

注意:因为它是敏感信息,所以更改了某些column \\ var名称,但是您会看到大图。

  <td>
    <asp:RadioButtonList  RepeatDirection="Horizontal" id="rdiolist" onclick="alert('hello');" runat="server" RepeatLayout="flow" AutoPostBack="true">
   <asp:ListItem selected="true"> $ </asp:ListItem>
   <asp:ListItem> Days </asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
</table>

<br />

    <table id="tblBudgetRessourceVP" runat="server" class="ProjetTable ProjetTableHover">
    <thead>
    <tr>
    <th style="width:80px">COLUMN 1</th>
    <th style="width:120px">COLUMN 2/th>
    <th style="width:120px">COLUMN 3</th>
    <th style="width:120px">COLUMN 4</th>
    <th style="width:120px">COLUMN 5</th>
    <th style="width:120px">COLUMN 6</th>
    <th style="width:120px">COLUMN 7</th>
    <th style="width:120px">COLUMN 8</th>
    </tr>
    </thead>

    </table>

方法后面的代码,这就是我想要不回发的调用,我们希望删除每次刷新的页面。 我将仅发布该函数的一个示例,因为该示例非常重复,因为它针对每一列进行了重复。 我用随机名称替换了一些变量名称,因为它是非常敏感的数据。

Private Sub FillTable(ByVal vProjetID As String)
    Dim sqlquery As String = "SELECT SUM(EFFORT_RESRC.NB_JP_PLANF) as Planifie, SUM(EFFORT_RESRC.NB_JP_DDC) as DDC, SUM(EFFORT_RESRC.NB_JP_REEL) as Reel, SUM(EFFORT_RESRC.NB_JP_RESTN) as RAF, " & _
                "SUM(EFFORT_RESRC.NB_JP_REVS) as Revise, SUM(EFFORT_RESRC.NB_JP_PROJT) as Projete, SUM(EFFORT_RESRC.ECART_REVS_PROJT) as Ecart,RESRC.ID_VP , VICE_PRESD.DE_VP, TA_COMPS.TAUX " & _
                "FROM EFFORT_RESRC INNER JOIN " & _
                "TA_COMPS ON EFFORT_RESRC.COMPOSANTEID = TA_COMPS.COMPOSANTEID INNER JOIN " & _
                "RESRC ON EFFORT_RESRC.NO_EMPLY = RESRC.NO_EMPLY INNER JOIN " & _
                "VICE_PRESD ON RESRC.ID_VP = VICE_PRESD.ID_VP " & _
                "WHERE EFFORT_RESRC.PROJETID = '" & vProjetID & "' AND EFFORT_RESRC.ANNEE = '" & dd_ressourceprojet_annee.SelectedValue & "' AND TA_COMPS.ANNEE = '" & dd_ressourceprojet_annee.SelectedValue & "' " & _
                "GROUP BY RESRC.ID_VP, VICE_PRESD.DE_VP, TA_COMPS.TAUX " & _
                "ORDER BY VICE_PRESD.DE_VP"

    Dim dtRessource As New DataTable
    Master.GetDataTable(dtRessource, sqlquery)

    While (tblBudgetRessourceVP.Rows.Count > 1)
        tblBudgetRessourceVP.Rows.RemoveAt(1)
    End While

    Dim tr As HtmlTableRow
    Dim td As HtmlTableCell


    For Each ressource As DataRow In dtRessource.Rows

        If ressource("DE_VP") <> curStrVP And curStrVP <> String.Empty Then
            tr = New HtmlTableRow

                td = New HtmlTableCell
                td.InnerHtml = curStrVP
                tr.Cells.Add(td)

                td = New HtmlTableCell
            td.Attributes.Add("class", "budget")
            If rdiolist.SelectedIndex = 0 Then // Check the selector, if $ or Days display
                td.InnerHtml = Format(curPlan, "### ### ### ### ### ##0.00$")
            Else
                td.InnerHtml = Format(curPlan, "####")
            End If
            totPlan += curPlan
            tr.Cells.Add(td)  // Add the cell to the table.

            td = New HtmlTableCell
            td.Attributes.Add("class", "budget")

            If rdiolist.SelectedIndex = 0 Then // Check if JP or $ is selected for display format.
                td.InnerHtml = Format(curDDC, "### ### ### ### ### ##0.00$")
            Else
                td.InnerHtml = Format(curDDC, "####")
            End if
            totDDC += curDDC
            tr.Cells.Add(td)

            td = New HtmlTableCell
            td.Attributes.Add("class", "budget")
            If rdiolist.SelectedIndex = 0 Then  // Check if JP or $ is selected for display format.
                td.InnerHtml = Format(curRevise, "### ### ### ### ### ##0.00$")
            Else
                td.InnerHtml = Format(curRevise, "####")
            End If
            totRevise += curRevise
            tr.Cells.Add(td)

感谢大家。

抱歉,我的回答有点延迟,因为自从如此放心以来我没有接触过VB。

现在,假设您要单击一个div(可以是按钮或任何html元素),但要从服务器中引入数据而不进行完整的回发。 以下是HTML设置。

<div id="click">click</div>
<div id="dvTest"></div>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="Scripts/json2.js" type="text/javascript"></script>

以下是我们将使用的jQuery代码:

<script type="text/javascript">
    $(function () {
        $("#click").click(function () {
            var o = new Object();
            o.ProjectId = 1;
            var x = JSON.stringify(o);
            $.ajax({
                url: 'Default.aspx/GetData',
                type: 'POST',
                dataType: 'JSON',
                contentType: 'application/json;charset=utf-8;',
                data: x,
                success: function (data) {
                    data = JSON.parse(data);
                    var d=data.hasOwnProperty("d") ? data.d : data;
                    //as we are returning fully rendered table
                    //we can directly set html of container div
                    $("#dvTest").html(d);
                },
                error: function (a, b, c) {
                    alert(b);
                }
            });
        });
    });
</script>

这就是您需要在代码隐藏文件(aspx.vb文件)中编写的内容。 这个用WebMethod属性修饰的public shared方法称为PageMethod 现在由于HtmlTable对象无法自动序列化,我们需要使用HtmlWriter将其呈现为StringBuilder并将完整的HTML返回给客户端:

<WebMethod()>
Public Shared Function GetData(ByVal ProjectId As String) As String

    Dim tbl As New HtmlTable
    Dim tr As HtmlTableRow
    Dim td As HtmlTableCell

    'instead of these loops you will polulate table rows/cells
    'based on the data returned in your data table
    For I As Integer = 1 To 5
        tr = New HtmlTableRow
        For j As Integer = 1 To 5
            td = New HtmlTableCell
            td.InnerHtml = "Cell " & I & j
            tr.Cells.Add(td)
        Next
        tbl.Rows.Add(tr)
    Next

    Dim sb As New StringBuilder
    Dim sr As New StringWriter(sb)
    Dim hr As New HtmlTextWriter(sr)
    tbl.RenderControl(hr)
    Return sb.ToString()
End Function

编辑: -ASP.Net通过序列化.Net对象返回JSON对象。 但是,此方法不适用于HtmlTable对象,因为它们未实现InnerHTML并且在那里引发了异常。

使用AJAX可以创建通用处理程序(假设您使用的是VS 2008或更高版本)。 通用处理程序将具有.ashx扩展名而不是.aspx扩展名。 本质上,它允许您控制输出,而Web窗体.aspx具有UI组件和背后的代码。 .ashx文件本质上是空白的,并且引用了您的代码。 在您的后台代码中,您可以编写所需的代码,此输出需要AJAX响应所需的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM