用ajax调用代码隐藏函数?

时间:2012-05-19 20:51:50

标签: javascript asp.net html ajax vb.net

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

我有一个包含数字的大HTML表格。 我有一个选择器(radiobuttonlist),用户可以点击,如果他想在$或几天内看到该表。

现在它工作得很好,但页面刷新,因为每当用户点击两个单选按钮之一时,我就会调用代码隐藏功能(RefreshTable),因为它改变了格式并需要RefreshTable函数完成的新计算< / p>

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

这是来自.ASPX页面的表格代码,它只是shell,所有内容都是通过在RadioButton更改时调用的VB.NET方法添加的(autopostback = true),所以我们检查哪一个被选中并执行VB用于填充表的.NET方法。 (功能代码如下)

注意:更改了一些列\ 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)

谢谢大家。

2 个答案:

答案 0 :(得分:1)

对不起,我有一点延迟回答,因为我没有触及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文件)中编写的内容。使用public shared属性修饰的WebMethod方法称为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并且在那里抛出异常。

答案 1 :(得分:0)

使用AJAX,您可以创建一个通用处理程序(假设您使用的是VS 2008或更高版本)。通用处理程序将具有.ashx扩展名而不是.aspx扩展名。从本质上讲,它允许您控制输出,而Web表单.aspx具有UI组件和代码隐藏。 .ashx文件基本上是空白的,并带有对代码隐藏的引用。在您的代码隐藏中,您可以编写所需的代码,输出您需要的AJAX响应。