以下代码在str为NULL时给出NULL引用错误,但仅在我们的生产服务器上,而不是在我们的开发或测试服务器上。
<div>
<input value="@Html.Raw(str)" />
</div>
这很好用:
<div>
<input value="@str" />
</div>
就像这样:
<div>
Values is: @Html.Raw(str)
</div>
因此,@ Html.Raw不能接受NULL参数的问题。我不确定在那种情况下它究竟返回了什么;但是在一台服务器上它与另一台服务器有所不同。
两者都运行相同版本的System.Web.Mvc,但我不知道要检查哪些其他DLL。 System.Web.WebPages是应该包含崩溃的MVC方法的程序集,它们在两台服务器上都是相同的版本。这是MVC版本4; .Net 4.5。
这样的事情怎么可能? WriteAttributeTo方法中出现错误,但我甚至不知道为什么会在这里调用,因为它使用标准的HTML输入标记,而不是@Html.TextBoxFor帮助。
修改的 可能有用的一件事是,如果其他人尝试将该代码放在他们自己的视图中以查看它是否有效。至少那时我会知道这是我的生产环境还是出乎意料的测试环境。
这是完整的堆栈跟踪:
at System.Web.WebPages.WebPageExecutingBase.WriteAttributeTo(String pageVirtualPath,TextWriter writer,String name,PositionTagged
1 prefix, PositionTagged
1个后缀,AttributeValue [] values)at System.Web.WebPages.WebPageExecutingBase.WriteAttributeTo(的TextWriter writer,String name,PositionTagged1 prefix, PositionTagged
1个后缀, AttributeValue []值)at System.Web.WebPages.WebPageExecutingBase.WriteAttribute(String name, PositionTagged1 prefix, PositionTagged
1个后缀,AttributeValue [] 在ASP._Page_Views_AdminSurvey_TopDown_cshtml.Execute()中的值) c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ fdd62ffd \ 90d151d1 \ App_Web_xsolwitr.2.cs:第0行at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()at System.Web.WebPages.StartPage.ExecutePageHierarchy()at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,TextWriter writer,WebPageRenderingBase startPage)at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) 在 System.Web.Mvc.ControllerActionInvoker&LT;&GT; C_ DisplayClass1a.b _17() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter,ResultExecutingContext preContext,Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func
1 continuation)at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,ActionResult actionResult)at System.Web.Mvc.Async.AsyncControllerActionInvoker&LT;&GT; C_ DisplayClass25.b _22(IAsyncResult的 asyncResult)at System.Web.Mvc.Controller&LT;&GT; C_ DisplayClass1d.b _18(IAsyncResult的 asyncResult)at System.Web.Mvc.Async.AsyncResultWrapper&LT;&GT; C_ DisplayClass4.b _3(IAsyncResult的 ar)在System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)at System.Web.Mvc.Async.AsyncResultWrapper&LT;&GT; C_ DisplayClass4.b _3(IAsyncResult的 一只老鼠 System.Web.Mvc.MvcHandler&LT;&GT; C_ DisplayClass6&LT;。&以及c _DisplayClassb.b_ 4(IAsyncResult的 asyncResult)at System.Web.Mvc.Async.AsyncResultWrapper&LT;。&以及c _DisplayClass4.b__3(IAsyncResult的 一只老鼠 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤, 布尔和放大器; completedSynchronously)
答案 0 :(得分:5)
感谢nemesv和Dave A的帮助,我能够找到问题所在。这是一个由两部分组成的答案。
1)异常的原因似乎是 Razor 组合Html.Raw
的实施中存在错误在 HTML 属性中。当 Razor View引擎 在 HTML 属性中遇到文本时,它会使用WebPageExecutingBase.WriteAttributeTo()
方法,即使它只是在普通的 HTML 中。以前我的印象是 Razor View Engine 仅处理了服务器端命令(@
符号后面的代码)。虽然Html.Raw
和WriteAttibuteTo()
都允许空值,但是需要特殊处理来处理组合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 包,其中包含 Ver 2.0.30506.0 WebPages dll 。
答案 1 :(得分:2)
这个次要版本号差异实际上是否有所不同?
当然可以,次要构建通常包含不间断的更改,但这并不意味着它们不能包含错误。看起来问题出现在System.Web.WebPages.WebPageExecutingBase
中,因此可以安全地假设System.Web.dll
版本不匹配可能是问题的根源。
您可以通过反汇编程序运行这两个DLL,看看该区域内和周围是否有任何明显的变化,但是,如果您知道在以后的构建中修复了该问题,那么只需在部署机器上使用它。
有Html.Raw
与{{1}}相关的{{1}}在8月修复的属性中使用时没有正确解码文本,不确定修复问题的2个版本之间的变化。 / p>
答案 2 :(得分:1)
让我们深入了解Razor View引擎:
当您的操作方法调用
时return View()
View()
方法返回 ViewResult 对象。 ViewResult 对象有一个ExecuteResult()
方法 - 负责创建 HTML 文档。
当ExecuteResult()
方法遇到像@Html.Raw
这样的帮助程序时,它会检查上下文。在填充属性的情况下, Razor View引擎 会通过遵循规则并避免陷阱来尝试智能(或不愚蠢)。用于属性值呈现的方法是WebPageExecutingBase.WriteAttributeTo()
。
如果您查找WriteAttributeTo()的签名,则会看到最后需要ParamArray
。同样,我们正在研究抽象方法(未发布),但我怀疑WriteAttributeTo()
方法的实现没有考虑空数组并引发异常。
答案 3 :(得分:0)
非常有趣的问题,我很高兴你找到了答案!
如果由于某些原因您遇到旧版本的DLL,请使用空合并操作符??
以确保内容永远不会null
<div>
<input value="@Html.Raw(str ?? "")" />
</div>