【问题标题】:JQuery getJSON method not being called未调用 JQuery getJSON 方法
【发布时间】:2018-08-23 19:44:24
【问题描述】:

我正在尝试使用 jQuery 和 json 创建一个带有分页的表格,但无法使用 getJSON 方法。 JavaScript 函数GetPageData 在页面加载时被调用并且被成功调用。我已经测试在下面的代码中添加了两个注释掉的行,并且可以看到 getJSON 方法内的任何代码都没有任何效果。

function GetPageData(pageNum, pageSize) {
    $("#tblData").empty();
    $("#paged").empty();
   // $("#tblData").append('<tr><td>1</td><td>2</td></tr>')
    $.getJSON("/Retailers/GetPagedData", { pageNumber: pageNum, pageSize: pageSize }, function (response) {
     //   $("#tblData").append('<tr><td>1</td><td>2</td></tr>')
        var rowData = "";
        for (var i = 0; i < response.Data.length; i++) {
            rowData = rowData + '<tr><td>' + response.Data[i].Name + '</td><td>' + response.Data[i].RetailerCode + '</td></tr>';
        }
        rowData = rowData + '<tr><td>Name</td><td>RetailerCode</td></tr>';
        $("#tblData").append(rowData);
        PagingTemplate(response.TotalPages, response.CurrentPage);
    });

下面是 Index.cshtml 视图,它位于 Retailers 文件夹中。

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/jquery")
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
@{
    ViewBag.Title = "Manage Retailers";
}
<p class="h2">Manage Retailers</p>
<br /><br />
<table class="table table-bordered">
    <thead>
        <tr>
            <th>Retailer Name</th>
            <th>Retailer Code</th>
        </tr>
    </thead>
    <tbody id="tblData"></tbody>
</table>
<div id="paged"></div>

下面是 RetailersController...

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using CCM.Models;
using CCM.Helper;

namespace CCM.Controllers
{
    public class RetailersController : Controller
    {
        MCDevEntities context = new MCDevEntities();
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult GetPagedData(int pageNumber = 1, int pageSize = 20)
        {
            List<Retailer> listData = context.Retailers.ToList();
            var pagedData = Pagination.PagedResult(listData, pageNumber, pageSize);
            return Json(pagedData, JsonRequestBehavior.AllowGet);
        }
    }
}

我是否遗漏了任何可能阻止其工作的明显内容?我还有一个包含 PagedData.cs 和 Pagination.cs 的 Helper 文件夹。页面 URL 是 localhost:.../Retailers/Index。

编辑。

如果有帮助,这里是 javascript 的其余部分:

$(document).ready(function () {
    //Initially load pagenumber=1, pagesize=20
    GetPageData(1, 20);
});

function PagingTemplate(totalPage, currentPage) {
    var template = "";
    var TotalPages = totalPage;
    var CurrentPage = currentPage;
    var PageNumberArray = Array();


    var countIncr = 1;
    for (var i = currentPage; i <= totalPage; i++) {
        PageNumberArray[0] = currentPage;
        if (totalPage != currentPage && PageNumberArray[countIncr - 1] != totalPage) {
            PageNumberArray[countIncr] = i + 1;
        }
        countIncr++;
    };
    PageNumberArray = PageNumberArray.slice(0, 5);
    var FirstPage = 1;
    var LastPage = totalPage;
    if (totalPage != currentPage) {
        var ForwardOne = currentPage + 1;
    }
    var BackwardOne = 1;
    if (currentPage > 1) {
        BackwardOne = currentPage - 1;
    }

    template = "<p>" + CurrentPage + " of " + TotalPages + " pages</p>"
    template = template + '<ul class="pager">' +
        '<li class="previous"><a href="#" onclick="GetPageData(' + FirstPage + ')"><i class="fa fa-fast-backward"></i>&nbsp;First</a></li>' +
        '<li><select ng-model="pageSize" id="selectedId"><option value="20" selected>20</option><option value="50">50</option><option value="100">100</option><option value="150">150</option></select> </li>' +
        '<li><a href="#" onclick="GetPageData(' + BackwardOne + ')"><i class="glyphicon glyphicon-backward"></i></a>';

    var numberingLoop = "";
    for (var i = 0; i < PageNumberArray.length; i++) {
        numberingLoop = numberingLoop + '<a class="page-number active" onclick="GetPageData(' + PageNumberArray[i] + ')" href="#">' + PageNumberArray[i] + ' &nbsp;&nbsp;</a>'
    }
    template = template + numberingLoop + '<a href="#" onclick="GetPageData(' + ForwardOne + ')" ><i class="glyphicon glyphicon-forward"></i></a></li>' +
        '<li class="next"><a href="#" onclick="GetPageData(' + LastPage + ')">Last&nbsp;<i class="fa fa-fast-forward"></i></a></li></ul>';
    $("#paged").append(template);
    $('#selectedId').change(function () {
        GetPageData(1, $(this).val());
    });
}

【问题讨论】:

  • 你试过 $.get() 而不是 $.getJSON() 吗?
  • 感谢您的建议,我现在已经尝试过了,似乎没有任何区别,$.get() 中的代码没有任何效果。
  • 您可以尝试将参数包含在 URL 中吗? /Retailers/GetPagedData?pageNumber=1&amp;pageSize=20 并从 $.getJSON 方法中删除此 { pageNumber: pageNum, pageSize: pageSize }
  • $.get("/Retailers/Index/GetPagedData?pageNumber=1&amp;pageSize=20", function (response) { 替换行$.getJSON("/Retailers/GetPagedData", { pageNumber: pageNum, pageSize: pageSize }, function (response) { 现在会导致方法内的代码运行,但不幸的是只有初始附加而不是表数据。我也不确定这种方法是否会导致页面加载,这是我试图避免的。再次感谢。
  • 您能否在控制台的网络选项卡中检查您的获取请求是否通过?

标签: jquery json ajax asp.net-mvc


【解决方案1】:

试试下面的代码

$.ajax({
            url: '/Retailers/GetPagedData',
            data: {
                pageNumber: pageNum,
                pageSize: pageSize
            },
            success: function (response) {
                //code
            }
        });

【讨论】:

  • 谢谢 Ajit,我现在已经尝试过了,但同样的事情发生了,表数据没有加载,并且在控制台的网络选项卡中如下:Server Error in '/' Application. A circular reference was detected while serializing an object of type 'System.Data.Entity.DynamicProxies.Retailer_B96A...。它尝试发送的请求 URL 是相同的:http://localhost:.../Retailers/GetPagedData?pageNumber=1&amp;pageSize=20 并手动将其放入 URL 会将错误返回到屏幕。
【解决方案2】:

试试这个并检查:

    $.ajax({
        url: '@Url.Action("GetPagedData", "Retailers")',
        data: {pageNumber : pageNum,
            pageSize: pageSize 
        },
        success: function (response) {
             console.log(response);
            //   $("#tblData").append('<tr><td>1</td><td>2</td></tr>')
            var rowData = "";
            for (var i = 0; i < response.Data.length; i++) {
                rowData = rowData + '<tr><td>' + response.Data[i].Name + '</td><td>' + response.Data[i].RetailerCode + '</td></tr>';
            }
            rowData = rowData + '<tr><td>Name</td><td>RetailerCode</td></tr>';
            $("#tblData").append(rowData);
            PagingTemplate(response.TotalPages, response.CurrentPage);
        }
    });

【讨论】:

  • 感谢您的回复,不幸的是数据没有使用此代码填充并检查网络选项卡我可以看到它有上面提到的相同错误。我在您的代码中将“零售商”更改为“零售商/索引”,从而避免了错误。取消注释代码中的测试行确实用测试数据填充了表,但实际数据没有被插入。我想知道我的模型是否有问题。
  • 更新了代码以记录控制器的结果。检查控制台中的结果,看看它显示了什么?
  • 谢谢,我得到了“TypeError: response.Data is undefined”。看来 response 不为空,但 response.Data 为空。
  • 所以错误出在您的控制器中,而不是在 JavaScript 中。修复它,你就可以开始了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2013-11-08
  • 2011-08-22
  • 1970-01-01
  • 2019-05-28
  • 2012-02-21
  • 1970-01-01
相关资源
最近更新 更多