C#MVC中的System.StackOverflowException,.cshtml文件中有很多变量

时间:2019-04-04 08:49:17

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

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

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

我通过使用ASP.NET模板网站(在创建新的ASP.NET项目时会自动创建)来重现此问题。我将@ViewBag.Title行添加了大约5000次,并再次收到了System.StackOverflowException

对我来说,该异常没有任何意义,因为项目应一开始执行每一行,以使堆栈永远不会溢出。

我想念什么吗?除了将数据发送给用户后通过JavaScript插入数据以外,还有谁知道我该如何处理?

1 个答案:

答案 0 :(得分:0)

我可以确认此问题很容易重现。只需从默认模板创建一个新的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.StackOverflowException)的情况下,从App_Web_ufrc1vtb.dll引发了一些 loooong 加载过程StackTrace == 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>

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