这是一个有效的jquery回调函数调用吗?

时间:2010-07-04 09:19:18

标签: jquery asp.net-mvc function callback call

我执行这样的函数,

<script type="text/javascript">
        $(document).ready(function() {

        getEntities("Clients/GetClients", 0, formatClientsResult);

        var maxvalues = $("#HfId").val();
        $(".pager").pagination(maxvalues, {
            callback: getEntities("Clients/GetClients", formatClientsResult),
            current_page: 0,
            items_per_page: 5,
            num_display_entries: 5,
            next_text: 'Next',
            prev_text: 'Prev',
            num_edge_entries: 1
        });
     });
  </script>

$(function() {
    $.ajaxSetup({
        contentType: 'application/json; charset=utf-8',
        global: false,
        async: false,
        dataType: 'json',
        beforeSend: function() { $('.loading').show(); },
        complete: function() { $('.loading').hide(); }
    });
});

function getEntities(url, currentPage, formatResultFunction) {
    $.ajax({
        url: url,
        data: { 'currentPage': (currentPage + 1), 'pageSize': 5 },
        success: function(data) {
            if (data.isRedirect && data.isRedirect === true) {
                alert('must redirect to ' + data.redirectUrl);
                location = 'http://www.google.com';
            }
            else {
                var divs = '';
                $("#hfId").val('');
                $("#ResultsDiv").empty();
                $.each(data.Results, function() {
                    divs += formatResultFunction(this);
                });
                $("#ResultsDiv").append(divs);
                $(".resultsdiv:even").addClass("resultseven");
                $(".resultsdiv").hover(function() {
                    $(this).addClass("resultshover");
                }, function() {
                    $(this).removeClass("resultshover");
                });
                $("#HfId").val("");
                $("#HfId").val(data.Count);

            }
        }
    });
    return false;
}


function formatClientsResult(result) {
    return '<div class="resultsdiv"><br /><span style="display: inline-block;width:220px;" class="resultName">' + result.ClientName + '</span><span class="resultfields" style="padding-left:10px;">Mobile No&nbsp;:</span>&nbsp;<span class="resultfieldvalues">' + result.ClientMobNo + '</span><span style="float:right; padding-right:2px;"><input type="checkbox" value=' + result.ClientId + ' onclick="storeIds();"/></span><br/><br/><span class="resultfields">Address&nbsp;:</span>&nbsp;<span class="resultfieldvalues">' + result.ClientAddress + '</span></div>';
}

我通过萤火虫检查我发现我的要求是,

http://localhost:1115/0?currentPage=[object+HTMLDivElement]1&pageSize=5 ...我错过了什么......

在初始加载时执行请求是

http://localhost:1115/Clients/GetClients?currentPage=1&pageSize=5

这似乎有效,但只有回调函数失败......

我正在使用此jquery pagination plugin

正如达林所说,

$(document).ready(function() {

            getEntities("Clients/GetClients", 0, formatClientsResult);
            var maxvalues = $("#HfId").val();
            $(".pager").pagination(maxvalues, {
                callback: function() {
                    getEntities("Clients/GetClients", 0, formatClientsResult);
                },
                current_page: 0,
                items_per_page: 5,
                num_display_entries: 5,
                next_text: 'Next',
                prev_text: 'Prev',
                num_edge_entries: 1
            });

我的控制器动作,

 public JsonResult GetClients(int currentPage, int pageSize)
        {
            if (Session["userId"]!=null)
            {
                var clients = clirep.FindAllClients(Convert.ToInt32(Session["userId"])).AsQueryable();
                var count = clients.Count();
                var results = new PagedList<ClientBO>(clients, currentPage - 1, pageSize);
                var genericResult = new { Count = count, Results = results ,isRedirect=false};
                return Json(genericResult);
            }
            else
            {
                var genericResult = new {redirectUrl = Url.Action("Create", "Registration"), isRedirect = true };
                return Json(genericResult);
            }

        }

我的模特,

public IQueryable<ClientBO> FindAllClients(int userId)
        {
            var client = from c in taxidb.Clients
                         where c.CreatedBy == userId && c.IsDeleted == 0 
                         select new ClientBO()
                         {
                             ClientId = c.ClientId,
                             ClientName= c.ClientName,
                             ClientMobNo= Convert.ToString(c.ClientMobNo),
                             ClientAddress= c.ClientAddress
                         };
            return client;
        }

和我的观点,

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TaxiMVC.Models.Client>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Clients</h2>
    <input type="hidden" id="hfId" />
    <input type="hidden" id="hfEditId" />
    <div id="ErrorDiv">
    </div>
    <div id="ImageButtonDiv">
        <input type="button" class="addbuttons" onclick="return showadd();" />
        <input type="button" class="editbuttons" onclick="if(editdetails()){return getClientbyId($('#hfId').val());}" />
        <input type="button" class="deletebuttons" onclick="if(deletedetails()){return deleteClients($('#hfId').val());}" />
    </div>
    <div id="ResultsDiv">
    </div>
    <div id="PagerDown" class="pager">
    </div>
    <div id="adddiv" style="display: none;">
        <form id="addform" autocomplete="off" action="">
        <fieldset>
            <legend>Client Details</legend>
            <table cellpadding="0" cellspacing="0" width="100%">
                <tr>
                    <td class="tdfields" style="width: 25%; padding-right: 20px;" align="right">
                        Client Name&nbsp;:
                    </td>
                    <td style="width: 20%;">
                        <%= Html.TextBox("Name", null, new { @class = "text_box_height_14_width_150" })%>
                        &nbsp;
                    </td>
                    <td style="width: 55%;" class="status">
                        &nbsp;
                    </td>
                </tr>
                <tr>
                    <td class="tdfields" style="width: 25%; padding-right: 20px;" align="right">
                        Mobile No&nbsp;:
                    </td>
                    <td style="width: 20%;">
                        <%= Html.TextBox("MobileNo", null, new { @class = "text_box_height_14_width_150" })%>
                        &nbsp;
                    </td>
                    <td style="width: 55%;" class="status">
                        &nbsp;
                    </td>
                </tr>
                <tr>
                    <td class="tdfields" style="width: 25%; padding-right: 20px;" align="right">
                        Address&nbsp;:
                    </td>
                    <td style="width: 20%;">
                        <%= Html.TextArea("Address", null, 6, 42, new { @class = "multiline_text_box_height_14_width_200" })%>
                        &nbsp;
                    </td>
                    <td style="width: 55%;" class="status">
                        &nbsp;
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <div class="form-submit">
                            <input type="submit" value="Submit" id="submit" />
                            &nbsp;&nbsp;<input type="button" value="Cancel" id="cancel" onclick="return showResultsdiv();" />
                        </div>
                    </td>
                    <td>
                    </td>
                </tr>
            </table>
        </fieldset>
        </form>
    </div>
    <input id="HfId" type="hidden" />

    <script type="text/javascript">
        $(document).ready(function() {
            //        getClients(0);
            getEntities("Clients/GetClients", 0, formatClientsResult);
            var maxvalues = $("#HfId").val();
            $(".pager").pagination(maxvalues, {
                callback: function() {
                    getEntities("Clients/GetClients", 0, formatClientsResult);
                },
                current_page: 0,
                items_per_page: 5,
                num_display_entries: 5,
                next_text: 'Next',
                prev_text: 'Prev',
                num_edge_entries: 1
            });

            var validator = $("#addform").validate({
                rules: {
                    Name: "required",
                    MobileNo: {
                        required: true,
                        number: true,
                        minlength: 10
                    },
                    Address: "required"
                },

                messages: {
                    Name: "please provide a client name",
                    MobileNo: {
                        required: "Please provide a mobile phone no",
                        number: "Please provide a mobile phone no",
                        rangelength: jQuery.format("Enter at least {0} characters")
                    },
                    Address: "please provide client address"
                },
                // the errorPlacement has to take the table layout into account
                errorPlacement: function(error, element) {
                    error.appendTo(element.parent().next());
                },
                // set this class to error-labels to indicate valid fields
                success: function(label) {
                    // set &nbsp; as text for IE
                    label.html("&nbsp;").addClass("checked");
                },

                submitHandler: function(form) {
                    if ($("#hfEditId").val() == "") {
                        $.ajax({
                            url: "Clients/ClientCreate",
                            data: { 'clientName': $("#Name").val(), 'clientMobNo': $("#MobileNo").val(), 'clientAddress': $("#Address").val() },
                            contentType: "application/json; charset=utf-8",
                            global: false,
                            async: false,
                            dataType: "json",
                            beforeSend: function() { $('.loading').show(); },
                            complete: function() { $('.loading').hide(); },
                            success: function(data) {
                                if (data.Result == "Success") {
                                    $("#hfEditId").val('');
                                    $("#addform").clearForm();
                                    getEntities("Clients/GetClients", 0, formatClientsResult);
                                    $("#adddiv").hide();
                                    $("#ResultsDiv").show();
                                    $("#PagerDown").show();
                                    $("#ImageButtonDiv").show();
                                    var maxvalues = $("#HfId").val();
                                    $(".pager").pagination(maxvalues, {
                                        callback: getEntities("Clients/ClientCreate", 0, formatClientsResult),
                                        current_page: 0,
                                        items_per_page: 5,
                                        num_display_entries: 5,
                                        next_text: 'Next',
                                        prev_text: 'Prev',
                                        num_edge_entries: 1
                                    });
                                    $("#alert").remove();
                                    topBar('successfully added');
                                    return false;
                                }
                            }
                        });
                    }
                    else {
                        $.ajax({
                            url: "Clients/Clientupdate",
                            data: { 'clientId': $("#hfEditId").val(), 'clientName': $("#Name").val(), 'clientMobNo': $("#MobileNo").val(), 'clientAddress': $("#Address").val() },
                            contentType: "application/json; charset=utf-8",
                            global: false,
                            async: false,
                            dataType: "json",
                            beforeSend: function() { $('.loading').show(); },
                            complete: function() { $('.loading').hide(); },
                            success: function(data) {
                                if (data.Result == "Success") {
                                    $("#hfEditId").val('');
                                    $("#addform").clearForm();
                                    getEntities("Clients/GetClients", 0, formatClientsResult);
                                    $("#adddiv").hide();
                                    $("#ResultsDiv").show();
                                    $("#PagerDown").show();
                                    $("#ImageButtonDiv").show();
                                    var maxvalues = $("#HfId").val();
                                    $(".pager").pagination(maxvalues, {
                                        callback: getEntities("Clients / Clientupdate", 0, formatClientsResult),
                                        current_page: 0,
                                        items_per_page: 5,
                                        num_display_entries: 5,
                                        next_text: 'Next',
                                        prev_text: 'Prev',
                                        num_edge_entries: 1
                                    });
                                    $("#alert").remove();
                                    topBar('successfully updated');
                                    return false;
                                }
                            }
                        });
                    }
                }
            });
        });

    </script>

</asp:Content>

4 个答案:

答案 0 :(得分:3)

我假设您正在使用的分页插件here的回调在内部定义为

opts.callback(current_page, containers);

这与你的回调签名不同,所以不会有同样的效果。

答案 1 :(得分:1)

getEntities函数需要3个参数。在这里你只通过2:

callback: getEntities("Clients/GetClients", formatClientsResult)

第二个参数也需要是整数而不是另一个函数。因为它是一个回调,所以需要这样定义:

callback: function() {
    getEntities("Clients/GetClients", 0, formatClientsResult);
}

更新:

您始终获得相同AJAX请求的原因是您始终将0传递给pagination callback中的getEntities函数。

试试这个:

$(".pager").pagination(maxvalues, {
    callback: function (new_page_index, pagination_container) {
        // Notice how the new_page_index is passed
        getEntities("home/GetClients", new_page_index, formatClientsResult);
    },
    current_page: 0,
    items_per_page: 5,
    num_display_entries: 5,
    next_text: 'Next',
    prev_text: 'Prev',
    num_edge_entries: 1
});

答案 2 :(得分:0)

显然currentPage的{​​{1}}参数是一个对象,因此向它添加1并不是一个明智的操作。用firebug检查getEntities()的类型和内容是什么。

答案 3 :(得分:0)

试试这个:

    $(document).ready(function() {
        var helper = function() {
            getEntities("Clients/GetClients", 0, formatClientsResult);
        };
        helper();
        var maxvalues = $("#HfId").val();
        $(".pager").pagination(maxvalues, {
            callback: helper,
            current_page: 0,
            items_per_page: 5,
            num_display_entries: 5,
            next_text: 'Next',
            prev_text: 'Prev',
            num_edge_entries: 1
        });