【发布时间】:2013-10-25 21:29:55
【问题描述】:
以下代码在 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 帮助器。
编辑 可能有帮助的一件事是,如果其他人尝试将该代码放在他们自己的视图中以查看它是否有效或损坏。至少那时我会知道是我的生产环境还是测试环境的行为异常。
这是完整的堆栈跟踪:
在 System.Web.WebPages.WebPageExecutingBase.WriteAttributeTo(String pageVirtualPath,TextWriter writer,字符串名称,PositionTagged
1 prefix, PositionTagged1 后缀,AttributeValue[] 值)在 System.Web.WebPages.WebPageExecutingBase.WriteAttributeTo(TextWriter writer,字符串名称,PositionTagged1 prefix, PositionTagged1 后缀, AttributeValue[] 值)在 System.Web.WebPages.WebPageExecutingBase.WriteAttribute(字符串名称, PositionTagged1 prefix, PositionTagged1 后缀,AttributeValue[] 值)在 ASP._Page_Views_AdminSurvey_TopDown_cshtml.Execute() 中 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET 文件\root\fdd62ffd\90d151d1\App_Web_xsolwitr.2.cs:第 0 行 System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 在 System.Web.Mvc.WebViewPage.ExecutePageHierarchy() 在 System.Web.WebPages.StartPage.ExecutePageHierarchy() 在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) 在 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext 上下文) 在 System.Web.Mvc.ControllerActionInvoker.c_DisplayClass1a.b_17() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter 过滤器,ResultExecutingContext preContext,Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func1 继续)在 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.c_DisplayClass1d.b_18(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncResultWrapper.c_DisplayClass4.b_3(IAsyncResult ar) 在 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncResultWrapper.c_DisplayClass4.b_3(IAsyncResult 一只老鼠 System.Web.Mvc.MvcHandler.c_DisplayClass6.c_DisplayClassb.b_4(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncResultWrapper.c_DisplayClass4.b__3(IAsyncResult 一只老鼠 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)
【问题讨论】:
-
字符串值为空?或者是别的什么?也许这个字符串有一些 unicode 弄乱了作者。
-
只有当它为空时才会发生。通过直接使用 null 而不是变量来测试它;结果相同。
-
您能否在您的生产服务器上部署的新创建的 MVC4 应用程序(只有一个控制器一个 aciton 一个视图)中重现该问题?或者这个问题只存在于你的真实应用中?如果您可以复制,您可以将您的复制上传到某个地方(github/skydrive/etc)吗?
-
@nemesv,两台服务器都设置为应用程序在 IIS 中是它自己的网站。看不出每个站点的设置有什么不同。我现在将尝试创建一个新应用进行测试。
-
@nemesv,新项目起初在两台服务器上都运行良好。我查了一下,发现新建MVC项目时,引用了Microsoft.AspNet.WebPages v2.0.20710.0。但我的另一个项目是引用 v2.0.20505.0。我更改了引用并重新部署,果然它仅在产品服务器上中断。所以这两个版本的 WebPages.dll 之间一定是有区别的。但是......如果项目引用旧版本,那么为什么该服务器会选择新版本?旧版本位于 bin 文件夹中。会不会在别处找到更新的版本?
标签: asp.net-mvc asp.net-mvc-4 razor