代码之家  ›  专栏  ›  技术社区  ›  Fast Chip

将大量选项从控制器传递到视图

  •  0
  • Fast Chip  · 技术社区  · 5 年前

    我有一个庞大的项目列表(15000)将填充在前端的项目下拉列表中。因此,我进行了一个ajax调用(根据公司的选择触发),并对控制器中的action方法进行了这个ajax调用,这个action方法填充服务项列表,并通过响应将其返回到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();
    
    
                    }
                });
    
            });
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   abhijeet abanave    5 年前

    原因:此问题是由于“内容长度”(有效负载)通过网络(HTTP请求)而产生的

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

    1. 在代码级别设置内容长度

      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>

    注意:我建议在配置级别配置它

    谢谢您