代码之家  ›  专栏  ›  技术社区  ›  Colin Brock

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

  •  0
  • Colin Brock  · 技术社区  · 14 年前

    我有一个ASP.NET MVC项目可以在本地计算机上正常工作(没有生成错误、服务器错误或其他任何错误)。但是,当我将项目发布到测试服务器时,我得到一个“ 对象引用未设置为对象的实例 “错误 For Each 在我看来。

    我在一个模型中有一个函数,它返回一个DataRowCollection。我在控制器中调用该函数,并将DataRowCollection传递给我的视图,然后该视图对行进行迭代,并显示必要的信息:

    在控制器中,我有:

    Function Index() As ActionResult
    
        Dim MyModel As New Model
        ViewData("MyDataRowCollection") = MyModel.GetDataRowCollection()
        Return View()
    
    End Function
    

    然后在视图中,这将引发错误:

    <%@ 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很陌生,所以我确信有更好的方法来做我正在做的事情(如果有的话我会很高兴听到),但我主要关心的是为什么这在我的本地计算机上可以正常工作,但在 为每个 在测试服务器上?

    请让我知道,如果我可以澄清上述任何一个,并提前感谢任何信息。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Stéphane    14 年前

    显然,未填充ViewData,因此ViewData(“MyDataRowCollection”)返回空值,这会引发异常。控制器中的代码将有助于了解发生了什么。

    编辑:
    我也看不出你的控制器有什么问题。这也很简单,我怀疑问题来自这里…可能更深入地了解getdata方法。

    无论如何,您可能希望使用强类型视图而不是普通视图。 强类型视图继承自viewpage(共t个),而不仅仅是viewpage。这样,您就可以将T类型的模型类传递给视图,并以强类型的方式访问它。

    此外,您不应该直接传递数据行,而是应该在控制器内部进行大量工作,并返回一个易于在视图中操作的列表。

    尽可能保持你的观点愚蠢。

    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
    %>
    

    这样,您还可以在控制器上编写测试并断言模型类包含的内容,而不必尝试查看HTML是否包含正确的结果…

    我将通过深入的解释,因为你可以在互联网上找到这一切,但通过一些工作来模拟你的依赖,然后你可以写这样的东西(我不是一个真正的VB大师,所以请原谅我的语法)

    Dim Controller As New HomeController
    Dim Result = Controller.Index()
    Assert.IsNotNull(Result.Model)