我有一个ASP.NET MVC项目,可以在我的本地计算机上正常工作(没有构建错误,服务器错误或任何东西)。但是,当我将项目发布到测试服务器时,我在视图中的For Each
上得到“对象引用未设置为对象的实例”错误。
我在模型中有一个返回DataRowCollection的函数。我在我的控制器中调用该函数并将DataRowCollection传递给我的View,然后迭代遍历行并显示必要的信息:
在控制器中我有:
Function Index() As ActionResult
Dim MyModel As New Model
ViewData("MyDataRowCollection") = MyModel.GetDataRowCollection()
Return View()
End Function
然后在View中抛出错误:
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
My Page Title
</asp:Content>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<%
For Each MyDataRow In ViewData("MyDataRowCollection")
' do stuff with each MyDataRow
Next
%>
我对ASP.NET MVC很陌生,所以我确信可能有更好的方法来做我正在做的事情(如果有的话,我会很高兴听到),但我主要担心的是为什么这在我的本地计算机上工作正常,但在测试服务器上的For Each
上抛出错误?
如果我能澄清上述任何内容,请告诉我,并提前感谢任何信息。
答案 0 :(得分:1)
显然,ViewData没有填充,因此ViewData(“MyDataRowCollection”)返回null,抛出异常。控制器中的代码有助于弄清楚发生了什么。
编辑:
我也没看到你的控制器有什么问题。它也很简单,我怀疑问题来自这里......可能更深入到你的GetData方法。
无论如何,您可能希望使用强类型视图而不是通用视图。 强类型视图继承自ViewPage(Of T)而不仅仅是ViewPage。这样,您可以将类型为T的模型类传递给视图,并以强类型方式访问它。
此外,您不应直接传递数据行,而应在控制器中进行大量工作,并在视图中返回易于操作的List。
让你的观点尽可能愚蠢。
Function Index() As ActionResult
Dim MyModel As New Model
Dim MyViewModel As New ViewModel
MyViewModel.Rows = MyModel.GetDataRowCollection()
var MyViewModel = MyModel.GetDataRowCollection()
Return View(MyViewModel)
End Function
和您的观点:
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>
...
<%
For Each MyDataRow In Model.Rows
' do stuff with each MyDataRow
Next
%>
这样你也可以在你的控制器上编写测试并断言你的Model类包含的内容,而不是试着看看HTML是否包含正确的结果......
我会通过深入的解释,因为你可以在互联网上找到这个,但是有一些工作来模拟你的依赖,你可以写这样的东西(我不是真正的VB大师,所以借口我的语法)
Dim Controller As New HomeController
Dim Result = Controller.Index()
Assert.IsNotNull(Result.Model)