WriteAttributeTo方法中的空引用异常

Gen*_*ari 7 asp.net-mvc razor asp.net-mvc-4

当str为NULL时,以下代码给出NULL引用错误,但仅在我们的生产服务器上,而不是在我们的开发或测试服务器上.

<div>
<input value="@Html.Raw(str)" />
</div>
Run Code Online (Sandbox Code Playgroud)

这很好用:

<div>
<input value="@str" />
</div>
Run Code Online (Sandbox Code Playgroud)

就像这样:

<div>
Values is: @Html.Raw(str)
</div>
Run Code Online (Sandbox Code Playgroud)

所以这不是@ Html.Raw无法接受NULL参数的问题.我不确定在那种情况下它究竟返回了什么; 但是在一台服务器上它与另一台服务器上有所不同.

两者都运行相同版本的System.Web.Mvc,但我不知道要检查的其他DLL.System.Web.WebPages是应该包含崩溃的MVC方法的程序集,它们在两台服务器上都是相同的版本.这是MVC版本4; .Net 4.5.

这样的事情怎么可能?WriteAttributeTo方法中出现错误,但我甚至不知道为什么会在这里调用,因为它使用的是标准HTML输入标记,而不是@Html.TextBoxFor帮助程序.

编辑 可能有用的一件事是,如果其他人尝试将该代码放在他们自己的视图中,以查看它是否有效.至少那时我会知道这是我的生产环境还是测试环境出乎意料的行为.

这是完整的堆栈跟踪:

在System.Web.WebPages.WebPageExecutingBase.WriteAttributeTo(String pageVirtualPath,TextWriter writer,String name,PositionTagged 1 prefix, PositionTagged1 suffix,AttributeValue [] values)at System.Web.WebPages.WebPageExecutingBase.WriteAttributeTo(TextWriter writer,String name,PositionTagged 1 prefix, PositionTagged1 suffix, System.Web.WebPages.WebPageExecutingBase.WriteAttribute(String name,PositionTagged)中的AttributeValue [] values)1 prefix, PositionTagged位于c:\ Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\fdd62ffd\90d151d1\App_Web_xsolwitr.2.cs中ASP._Page_Views_AdminSurvey_TopDown_cshtml.Execute()的1个后缀,AttributeValue []值): System.Web.WebPages.Web上的System.Web.WebPages.Web中的System.Web.Web.Mtc.Web上的System.Web.Mvc.WebViewPage.ExecutePageHierarchy()中的System.Web.WebPages.Web.B.P.P. System.Web.Mvc.ControllerActionInvoker的System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)中的pageContext,TextWriter writer,WebPageRenderingBase startPage.<> c_ DisplayClass1a.b _17()at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (IResultFilter过滤器,ResultExecutingContext preContext,Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func在系统的System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,ActionResult actionResult)的System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c_ DisplayClass25.b _22(IAsyncResult asyncResult)中继续).System.Web.Mvc.Controller.EndExecuteCore上的System.Web.Mvc.Async.AsyncResultWrapper.<> c_ DisplayClass4.b _3(IAsyncResult ar)中的Web.Mvc.Controller.<> c_ DisplayClass1d.b _18(IAsyncResult asyncResult)IAsyncResult asyncResult)在System.Web.Mvc.Async.AsyncResultWrapper.<> c_ DisplayClass4.b _3(IAsyncResult ar)在System.Web.Mvc.MvcHandler.<> c_ DisplayClass6.<> c _DisplayClassb.b_4(IAsyncResult asyncResult)在System.Web.Mvc.Async.AsyncResultWrapper.<> c _DisplayClass4.b__3(IAsyncResult ar)的System.Web上的System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() .HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)

Gen*_*ari 5

感谢nemesv和Dave A的帮助,我能够找到问题所在.这是一个由两部分组成的答案.

1)异常的原因似乎是Razor实现Html.RawHTML属性内部组合中存在错误.当Razor View EngineHTML属性中遇到文本时,它会使用该WebPageExecutingBase.WriteAttributeTo()方法,即使它只是在纯HTML内部.以前我的印象是Razor View Engine只处理了服务器端命令(@符号后面的代码).虽然两者Html.RawWriteAttibuteTo()允许空值,需要特殊处理,结合2,和代码是崩溃,如果有一个空值.

2)这已经在System.Web.WebPages.dll的最新版本中更新/修复,这导致了答案的第二部分.该项目引用了该DLL的Ver 2.0.20505.0,并将其部署在项目的bin文件夹中.此版本包含错误.

但即使它被项目引用,并且在bin文件夹中,测试服务器也没有使用该版本的DLL进行程序集绑定.fuslog.exe透露它绑定了一个在GAC注册的程序集,而不是Ver 2.0.20710.0.QA服务器在GAC中有这个,而生产服务器没有.我不知道GAC会覆盖bin文件夹中的dll.

我已经更新我的项目中引用了最新ASPNetMVC包,其中包括版本2.0.30506.0的的网页DLL.