发布到测试服务器时ASP.NET MVC(VB)错误

时间:2010-04-15 16:00:03

标签: asp.net-mvc vb.net

我有一个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上抛出错误?

如果我能澄清上述任何内容,请告诉我,并提前感谢任何信息。

1 个答案:

答案 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)