#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)