Система.Исключение StackOverflowException в C # MVC со многими переменными в файле .cshtml

#c# #asp.net #asp.net-mvc

#c# #asp.net #asp.net-mvc

Вопрос:

У меня есть большой .cshtml файл в моем проекте, который содержит около 4000 строк кода (переменные HTML и .NET). До сегодняшнего дня все работало нормально, но теперь я получаю System.StackOverflowException после добавления еще нескольких переменных.

После повторного удаления некоторых строк я понял, что, должно быть, достиг максимума переменных в cshtml файле.

Я воспроизвел проблему, используя ASP.NET шаблон веб-сайта, который автоматически создается при создании нового ASP.NET проект. Я добавил @ViewBag.Title строку примерно 5000 раз и снова получил System.StackOverflowException .

Для меня это исключение не имеет никакого смысла, потому что проект должен выполнять строки одну за другой, чтобы в стеке никогда не было переполнения.

Я что-то пропустил? Кто-нибудь знает, как я могу с этим справиться, кроме как вставив данные через JavaScript после их отправки пользователю?

Комментарии:

1. Ошибка была вызвана тем, что слишком много вызовов вложенных методов, а не тем, что у вас слишком много переменных.

2. Да, конечно, но я воспроизвел проблему, используя базовый ASP.NET проект без добавления какой-либо функции или вызова функции. Мне кажется, что переменные являются вложенными вызовами функций в . ЧИСТЫЙ код, но я надеюсь, что кто-нибудь сможет объяснить это поведение и дать мне решение для этого.

3. Я только что воспроизвел это. После очень долгого процесса загрузки страницы System.StackOverflowException выбрасывается из App_Web_ufrc1vtb.dll с пустой (null) трассировкой стека. Предположим, что это ошибка в Razor renderer:

4. Спасибо, что нашли время воспроизвести проблему!

Ответ №1:

Я могу подтвердить, что эта проблема легко воспроизводима. Просто создайте новый проект 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 amp;raquo;</a></p>
</div>

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

Запустите свой проект, и после некоторого долгого процесса загрузки System.StackOverflowException он будет запущен из App_Web_ufrc1vtb.dll без StackTrace ( 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>
  

Это в общей сложности 10 000 раз <span>@ViewBag.Title</span> , и все работает нормально.

Комментарии:

1. Я решил проблему, используя этот метод) (y)