WriteAttributeTo方法中的空引用异常

时间:2013-10-25 21:29:56

标签: asp.net-mvc asp.net-mvc-4 razor

以下代码在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,PositionTagged 1 prefix, PositionTagged 1个后缀,   AttributeValue []值)at   System.Web.WebPages.WebPageExecutingBase.WriteAttribute(String name,   PositionTagged 1 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,Func 1 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)

4 个答案:

答案 0 :(得分:5)

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

1)异常的原因似乎是 Razor 组合Html.Raw的实施中存在错误在 HTML 属性中。当 Razor View引擎 HTML 属性中遇到文本时,它会使用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 包,其中包含 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>