我正在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)
什么是'pcp'在'哪里n.PCP == pcp'? –
oops - 我返回的字段多于显示的字段,为了便于阅读,我只是将其剪下来。 pcp字符串是一个传入的参数。我添加了它。该参数来自数据库填充的下拉列表。 – Daniela
你可以在调试器下运行它吗?调用堆栈窗口显示堆栈溢出原因。 – usr