C#Razor静态帮助程序错误“集合已修改”
本文关键字:修改 集合已修改 集合 静态 帮助程序 错误 C#Razor | 更新日期: 2023-09-27 18:25:31
在我的MVC web应用程序中,我在/App_Code/Functions.shtml中有一个简单的静态Razor助手,我用它来编写用于在各种不同视图页面上共享社交媒体的HTML:
@helper share (string url = null)
{
if (url != null)
{
string fullUrl = "http://example.com" + url;
<span class="share">
<span class="text">Share</span>
<a href="https://www.facebook.com/sharer.php?u=@fullUrl " class="facebook">Facebook</a>
<a href="https://www.twitter.com/intent/tweet?url=@fullUrl " class="twitter">Twitter</a>
<a href="https://plus.google.com/share?url=@fullUrl " class="google">Google+</a>
</span>
}
}
然而,我有时会收到错误"Collection was modified;enumeration operation may not execute",尤其是在执行站点范围的链接检查时,例如,它总是在设置"fullUrl"变量的帮助程序的第5行中断。
由于我在这里没有使用任何集合,我真的不知道为什么会发生这种情况,也不知道如何修复它。我怀疑这可能与线程安全有关,但如果有任何帮助,我们将不胜感激。
这是错误的堆栈跟踪示例:
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.BrowserLinkExecutionListener.GetOutputPositionTracker(TextWriter textWriter)
at Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.BrowserLinkExecutionListener.BeginContext(PageExecutionContext context)
at CallSite.Target(Closure , CallSite , Object , Object )
at System.Web.WebPages.Instrumentation.PageExecutionListenerAdapter.BeginContext(PageExecutionContextAdapter context)
at System.Web.WebPages.Instrumentation.InstrumentationService.BeginContext(HttpContextBase context, String virtualPath, TextWriter writer, Int32 startPosition, Int32 length, Boolean isLiteral)
at System.Web.WebPages.HelperPage.BeginContext(TextWriter writer, String virtualPath, Int32 startPosition, Int32 length, Boolean isLiteral)
at ASP.Functions.<>c__DisplayClassc.<share>b__b(TextWriter __razor_helper_writer) in 'App_Code'Functions.cshtml:line 143
at System.Web.WebPages.HelperResult.WriteTo(TextWriter writer)
at System.Web.WebPages.WebPageExecutingBase.WriteTo(TextWriter writer, HelperResult content)
at System.Web.WebPages.WebPageBase.Write(HelperResult result)
at ASP._Page_Views_News__Article_cshtml.Execute() in 'Views'_Article.cshtml:line 134
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.StartPage.RunPage()
at System.Web.WebPages.StartPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
更新
我只做了以下操作就复制了这个问题。。。
/App_Code/Functions.shtml:中的Helper方法
@helper Test ()
{
@:test
}
空视图页面顶部的方法调用:
@Functions.Test()
当视图被连续多次请求时,就像执行链接检查时一样,每隔一段时间就会出现相同的错误。
您的代码看起来无害,因此请考虑堆栈跟踪。这可能与PageInspector有关。这里有一个可能的修复
核心是在web.config
中添加此应用程序设置;
<appSettings>
<add key="PageInspector:ServerCodeMappingSupport" value="Disabled" />
</appSettings>
或者在web.config
中添加此<remove assembly=
标签;
<compilation debug="true" targetFramework="4.5">
<assemblies>
<remove assembly="Microsoft.VisualStudio.Web.PageInspector.Loader,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"/>
</assemblies>
</compilation>
只有在迭代列表时修改列表时才会出现错误。例如:
foreach (var item in myList)
{
myList.Remove(item);
}
将引发此异常,因为枚举时正在修改可枚举对象的长度。CCD_ 4也会出现同样的情况。你还没有发布过这样的代码,所以这个错误发生在这个代码之外。查找您可能在for
或foreach
块中修改列表的位置,这就是您的问题所在。