Entity framework 向客户端呈现视图后的StackOverflowException

Entity framework 向客户端呈现视图后的StackOverflowException,entity-framework,asp.net-mvc-5,entity-framework-6,Entity Framework,Asp.net Mvc 5,Entity Framework 6,我只是在学习MVC,所以如果这是一个新手的错误,我很抱歉,但是我在其他地方找不到解决方案 我正在尝试创建一个可以编辑多条记录的页面。在调试模式下,我的视图将在浏览器中呈现和显示,但随后我在System.Web.dll中获得StackOverflowException。如果我将代码发布到生产服务器,HTTP请求将永远不会完成(超时) 这是带有EntityFramework 6.1的MVC5 以下是控制器的操作方法: ' GET: HonorBoxes Function Index() As Act

我只是在学习MVC,所以如果这是一个新手的错误,我很抱歉,但是我在其他地方找不到解决方案

我正在尝试创建一个可以编辑多条记录的页面。在调试模式下,我的视图将在浏览器中呈现和显示,但随后我在System.Web.dll中获得StackOverflowException。如果我将代码发布到生产服务器,HTTP请求将永远不会完成(超时)

这是带有EntityFramework 6.1的MVC5

以下是控制器的操作方法:

' GET: HonorBoxes
Function Index() As ActionResult
    Dim hb = From h In db.honorBoxes Select h Where Not h.Filled And Not h.Hold
    Return View(hb.ToList())
End Function
以及以下观点:

@ModelType IEnumerable(Of Vending.HonorBox)
@Code
ViewData("Title") = "Index"
End Code

<h2>Index</h2>

@Html.BeginForm("Index", "HonorBoxes")
@Html.AntiForgeryToken()
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(Function(model) model.BoxID)
        </th>
        <th>
            @Html.DisplayNameFor(Function(model) model.Qty)
        </th>
    </tr>

@For x = 0 To Model.Count - 1
    @code 
        Dim item As HonorBox = Model(x)
    End Code
    @<tr>
        <td>
            @Html.Display(item.BoxID)
            @Html.Hidden("boxes(" & x & ").BoxID", item.BoxID)
        <td>
            @Html.TextBox("boxes(" & x & ").Qty", item.Qty)

        </td>
    </tr>
Next

</table>
<div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <input type="submit" value="Save" class="btn btn-default" />
    </div>
</div>
@ModelType IEnumerable(自动售货机的荣誉盒)
@代码
ViewData(“标题”)=“索引”
结束代码
指数
@BeginForm(“索引”、“荣誉框”)
@Html.AntiForgeryToken()
@DisplayNameFor(函数(模型)model.BoxID)
@Html.DisplayNameFor(函数(模型)模型数量)
@对于x=0的模型,计数为-1
@代码
尺寸项目为箱=型号(x)
结束代码
@
@Html.Display(item.BoxID)
@Html.Hidden(“框(“&x&”).BoxID”,item.BoxID)
@文本框(“框(“&x&”)数量,项目数量)
下一个
最后,讨论中的模型类(如果相关):

公共类荣誉框
Private _填充为可空(属于布尔型)
私有_数量可为空(整数)
Private _hold为空(布尔值)
公共属性BoxID为整数
公共属性AssetID为可空(整数的)
作为资产的公共财产资产
公共属性BoxType为字符串
公共属性保持为可空(布尔值)
得到
如果是IsDBNull(_hold),则返回False
返回保持
结束
设置(值为空(布尔值))
_持有=价值
端集
端属性
公共属性填充为可空(属于布尔值)
得到
如果IsDBNull(_填充),则返回False
退货已填好
结束
设置(值为空(布尔值))
_填充=值
端集
端属性
可为空的公共属性数量(整数的)
得到
如果是IsDBNull(_数量),则返回0
退货数量
结束
设置(值为可空(整数))
_数量=价值
端集
端属性
末级
编辑-因此,有时会从序列化库引发异常。这让我怀疑是否是我试图编辑的记录数量导致了StackOverflowException。我减少了显示的记录的数量,确实效果很好。我不确定是什么原因造成了这一点,但是-我仍然想编辑更多的记录,如果可能的话

编辑#2(添加了VIEWMODEL)-我不知道viewmodels,直到下面提到它们。我向项目中添加了HonorBoxView模型(仅具有.Qty和.BoxID属性),更改了视图中的模型类型,并将控制器方法修改为以下内容:

    Function Index() As ActionResult
        Dim hb = From h In db.honorBoxes Select h Where Not h.Filled And Not h.Hold
        Dim hbv As IEnumerable(Of HonorBoxView) = From h In hb Select New HonorBoxView() With {.Qty = h.Qty, .BoxID = h.BoxID}
        Return View(hbv.ToList())
    End Function

    <HttpPost>
    Function Index(boxes As List(Of HonorBoxView)) As ActionResult
        If ModelState.IsValid Then
            For Each box In boxes
                Dim cbox = db.honorBoxes.Find(box.BoxID)
                If Not IsDBNull(box.Qty) AndAlso cbox.Qty <> box.Qty Then
                    cbox.Qty = box.Qty
                    cbox.Filled = True
                End If
            Next
            db.SaveChanges()
        End If
        Return RedirectToAction("Index")
    End Function
函数索引()作为ActionResult
Dim hb=从分贝中的h选择h,其中未填充h且未保持h
Dim hbv As IEnumerable(Of HonorBoxView)=从hb中的h选择新HonorBoxView(),并使用{.Qty=h.Qty、.BoxID=h.BoxID}
返回视图(hbv.ToList())
端函数
函数索引(框作为列表(HonorBoxView))作为ActionResult
如果ModelState.IsValid,则
每个盒子中的每个盒子
Dim cbox=db.boxes.Find(box.BoxID)
如果不是IsDBNull(盒子数量)和cbox.Qty盒子数量,则
箱数量=箱数量
cbox.Filled=True
如果结束
下一个
db.SaveChanges()
如果结束
返回重定向操作(“索引”)
端函数

我仍然得到相同的StackOverflowException。它发生在HTML呈现给客户端之后,但在请求完成之前。

您试图显示多少条记录?我最初尝试使用200条记录,但得到了异常。我将其减少到50,效果很好。如果
资产
属性很复杂,您可能需要在一个视图中对尝试处理的内容进行更多选择—使用简化的HoronboxViewModel或对集合进行分页。感谢您的建议!我添加了一个精简的viewmodel,但在HTML呈现后仍会引发相同的异常。只是猜测一下,您是否正确关闭了所有的
标记,或者这只是一个输入错误?
    Function Index() As ActionResult
        Dim hb = From h In db.honorBoxes Select h Where Not h.Filled And Not h.Hold
        Dim hbv As IEnumerable(Of HonorBoxView) = From h In hb Select New HonorBoxView() With {.Qty = h.Qty, .BoxID = h.BoxID}
        Return View(hbv.ToList())
    End Function

    <HttpPost>
    Function Index(boxes As List(Of HonorBoxView)) As ActionResult
        If ModelState.IsValid Then
            For Each box In boxes
                Dim cbox = db.honorBoxes.Find(box.BoxID)
                If Not IsDBNull(box.Qty) AndAlso cbox.Qty <> box.Qty Then
                    cbox.Qty = box.Qty
                    cbox.Filled = True
                End If
            Next
            db.SaveChanges()
        End If
        Return RedirectToAction("Index")
    End Function