2015-12-06 29 views
0

我正在MVC 5中开发,并且在GET可以返回多个记录(900+)的错误。MVC 5 - GET上的无限循环或递归 - 反射问题

此页面也POST多行更新,但我收到的GET无限循环。如果页面有很多记录返回(120ish +),我得到无限循环错误。它似乎不会发生在记录较少的页面上(< 100),但即使如此,该页面的加载时间也比我预期的要长。

以下是错误:

  • 确保你没有一个无限循环或无穷递归

  • System.StackOverflowException了未处理 消息:类型系统的”未处理的异常。 StackOverflowException'发生在System.Runtime.Serialization.dll中

  • 我没有在特定行发生错误,但在反汇编的某一时刻,我看到一个错误条g.EqualsHelper(string,string)+ 0x0000000c正在处理iisexpress.exe。 (这不会发生每次页面崩溃)

有一个问题,我的代码,或者是记录数返回页面中的问题?页面上有时会记录900条记录。我可以添加分页,但在一个页面上的所有记录对用户更有效。用户批量设置页面上的字段值,然后更改批量设置值以获取不同数量的记录。

我已经尝试了一个for和foreach循环,但我有同样的错误使用这两种方法(我不知道什么是最好的使用在这种情况下)。

我一直在努力这一段时间,而我没有发现问题。

控制器

public ActionResult PCPList(string location, string pcp) 
{ 
    List<PCPListVM> data = new List<PCPListVM>(); 
    //query 
    data = (from n in db.DataDump     
      join t in db.TData on n.SubscriberID equals t.SubscriberID into joinedTable 
      from td in joinedTable.Take(1).DefaultIfEmpty() 
      where n.PCP == pcp 
      orderby n.MemberName 
      select new PCPListVM() 
      { 
       ID = n.ID, 
       MemberName = n.MemberName, 
       DateOfBirth = n.DateOfBirth, 
       PCP = n.PCP, 
       Location = td.Location, 
       LocationList = db.LocationList.Select(c => new SelectListItem 
       { 
        Value = c.LocationID, 
        Text = c.LocationList, 
        Selected = c.LocationList.Equals(location) 
       }).OrderBy(x => x.Text); 
      }).ToList(); 
    return View(data); 
} 

查看

@model List<Project.ViewModels.PCPListVM> 
// loop through records 
@if (Model != null && Model.Count > 0) 
{ 
    int j = 0; 
    foreach (var i in Model) 
    { 
     <tr> 
      <td>@j</td> 
      <td>@i.SubscriberID</td> 
      <td>@i.MemberName</td> 
      <td>@i.DateOfBirth</td> 
      <td>@i.PCP</td> 
      <td> 
       @Html.DropDownListFor(a => a[j].Location, (IEnumerable<SelectListItem>)ViewBag.location, "", new { @class = "input-sm" }) 
      </td> 
     </tr> 
     j++; 
    } 
} 

型号

public class PCPListVM 
{ 
    [Key] 
    [Required] 
    public string SubscriberID { get; set; }  
    public string MemberName { get; set; } 
    public DateTime? DateOfBirth { get; set; } 
    public string PCP { get; set; }   
    public string Location { get; set; }  
    public IEnumerable<SelectListItem> LocationList { get; set; } 
} 

更新 -

我的测试情况下返回1200行。我也尝试完全删除下拉菜单以查看它们是否是问题,并且页面仍然崩溃。我检查了控制器,正确的数量的记录正在返回给视图模型。

运行分析器后,我看到以下消息:System.Reflection。 。获取。(。*)= 9.01;你可能会过度使用反射。这是一项昂贵的操作。

有没有更好的方式来拉取这些数据并循环播放?

我在调用堆栈中看到的错误是:System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetId(System。的RuntimeTypeHandle)

+0

什么是'pcp'在'哪里n.PCP == pcp'? –

+0

oops - 我返回的字段多于显示的字段,为了便于阅读,我只是将其剪下来。 pcp字符串是一个传入的参数。我添加了它。该参数来自数据库填充的下拉列表。 – Daniela

+0

你可以在调试器下运行它吗?调用堆栈窗口显示堆栈溢出原因。 – usr

回答

0

当做LocationList创作,这样做:

LocationList = db.LocationList.Select(c => new SelectListItem 
       { 
        Value = c.LocationID, 
        Text = c.LocationList, 
        Selected = c.LocationList.Equals(location) 
       }).OrderBy(x => x.Text).ToList() 

我在想,Json.NET试图序列化IEnumerable的回应时,有一些循环引用问题。

+0

我试过了,它不起作用。我也尝试完全删除下拉菜单以查看它们是否是问题,并且页面仍然崩溃。我检查了控制器,正确的数量的记录正在返回给视图模型。我想知道在我看来循环是否有问题。这是我第一次完成批量更新。 – Daniela

+0

在选择前有多少条记录? –

+0

返回1200条记录, – Daniela

0

在这种情况下,似乎返回的记录数量导致性能问题。我最终将记录返回到WebGrid并由200分页,并且不再接收错误消息。