【问题标题】:Passing a big list of options from controller to view将大量选项从控制器传递到视图
【发布时间】:2019-04-24 14:36:17
【问题描述】:

我有一个巨大的项目列表(15000)要填充到前端下拉的项目中。因此,我进行了 AJAX 调用(在选择公司时触发),并且此 AJAX 调用对控制器中的操作方法进行,此操作方法填充服务项列表并通过响应将其返回给 AJAX 调用。这是我的 AJAX 调用失败的地方。如果我有大约 100 - 500 个项目,则 ajax 调用有效。我该如何解决这个问题?

控制器代码

[HttpPost]
        public ActionResult GetCompanyInfo(int Name)
        {
            try
            {
                List<SelectList> lists = new List<SelectList>();

                //This yields about 100 - 20000 items depending on the company
                var serviceItem = cache.getServiceItems(Name).ToList();
                serviceItem.Insert(0, null);
                ViewBag.SelectedServiceItem = new SelectList(serviceItem, "ID", "Name", model.SelectedServiceItem);

                //there are some lists here that not shown for the purpose of demonstation 
                lists.Add(ViewBag.SelectedServiceItem);

                return Json(lists);
            }
            catch (Exception e)
            {
                log.Error(e);
                return null;
            }


        }

AJAX 代码:

$("#selectedCompany").change(function () {
            $("#dashSpinner").show();
            var rule = {
                name: $("#selectedCompany").val(),
            }
            debugger;
            $.ajax({
                type: 'POST',
                data: rule,
                url: '@Url.Action("GetCompanyInfo")',
                success: function (lists) {

                    $.each(lists[1], function (i, serviceItem) {
                        $("#SelectedServiceItem").append('<option value="' + serviceItem.Value + '">' +
                         serviceItem.Text + '</option>');
                    });
                    $.each(lists[7], function (i, product) {
                        $("#SelectedProduct").append('<option value="' + product.Value + '">' +
                         product.Text + '</option>');
                    });

                    $("#dashSpinner").hide();


                }
            });

        });

【问题讨论】:

  • 为什么ajax调用失败?请求是否超时?
  • 似乎不是请求超时。
  • 你有什么错误?您是否确认您的 api 实际上返回了 15K 项?
  • 我收到以下错误:加载资源失败:服务器响应状态为 500(内部服务器错误)
  • 恕我直言,“性能问题”是您最少的问题。您希望最终用户如何处理 1500 个选项?

标签: c# ajax asp.net-mvc performance model-view-controller


【解决方案1】:

为什么:这个问题是由于“内容长度”(有效负载)通过网络(HTTP 请求)传递而发生的

解决方案:有两种方法可以解决这些问题

  1. 在代码级别设置 Content-Length

    lists.Add(ViewBag.SelectedServiceItem); var jsonResult = Json(lists, JsonRequestBehavior.AllowGet); jsonResult.MaxJsonLength = int.MaxValue; return jsonResult;

  2. 在您的 web.config 中的配置级别

    <configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="50000000"/> </webServices> </scripting> </system.web.extensions> </configuration>

注意:我建议在配置级别进行配置

谢谢

【讨论】:

  • 我尝试使用第二种解决方案,但它不起作用。然而,第一个解决方案对我有用。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多