首页 > 解决方案 > C# MVC 中的 System.StackOverflowException,.cshtml 文件中有许多变量

问题描述

我的项目中有一个大.cshtml文件,其中包含大约 4000 行代码(HTML 和 .NET 变量)。System.StackOverflowException直到今天一切正常,但现在我在添加更多变量后收到了一个。

再次删除一些行后,我意识到我必须在cshtml文件中达到最大变量。

我使用创建新 ASP.NET 项目时自动创建的 ASP.NET 模板网站重现了该问题。我已经添加了@ViewBag.Title大约 5000 次线路并再次收到了System.StackOverflowException.

对我来说,这个异常没有任何意义,因为项目应该逐行执行,以便堆栈永远不会溢出。

我错过了什么吗?有谁知道我可以如何处理它,除非在将数据发送给用户后通过 JavaScript 插入数据?

标签: c#asp.netasp.net-mvc

解决方案


我可以确认这个问题很容易重现。只需从默认模板创建一个新的 MVC5 项目并替换Views/Home/Index.cshtml为:

@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>ASP.NET</h1>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <p><a href="http://asp.net" class="btn btn-primary btn-lg">Learn more &raquo;</a></p>
</div>

<div class="row">
    <span>@ViewBag.Title</span>
    @* ... *@
    @* ~ 5000 times of "<span>@ViewBag.Title</span>" *@
    @* ... *@
    <span>@ViewBag.Title</span>
</div>

运行您的项目,并在没有 StackTrace ( )的情况下引发了一些冗长的加载过程。System.StackOverflowExceptionApp_Web_ufrc1vtb.dllStackTrace == null

我建议您在github上打开一个问题,但是您可以通过减小.cshtml. 例如,我创建一个_PartView.cshtml像这样的局部视图:

<div>
    <span>@ViewBag.Title</span>
    @* ... *@
    @* ~ 50 times of "<span>@ViewBag.Title</span>" *@
    @* ... *@
    <span>@ViewBag.Title</span>
</div>

然后我创建另一个像这样的局部视图_PartOfPartsView.cshtml

<div>
    @{Html.RenderPartial("_PartView");}
    @* ... *@
    @* ~ 20 times of "@{Html.RenderPartial("_PartView");}" *@
    @* ... *@
    @{Html.RenderPartial("_PartView");}
</div>

最后修改Views/Home/Index.cshtml如下:

<div class="row">
    @{Html.RenderPartial("_PartOfPartsView");}
    @* ... *@
    @* ~ 10 times of "@{Html.RenderPartial("_PartOfPartsView");}" *@
    @* ... *@
    @{Html.RenderPartial("_PartOfPartsView");}
</div>

这总共是 10 000 次,<span>@ViewBag.Title</span>并且一切正常。


推荐阅读