如何在视图中显示列表变量?

时间:2015-01-21 14:42:50

标签: asp.net-mvc razor

问题

为什么我的viewmodel不能遍历我的List Books变量?

代码

模型定义

public class Shelf
{
    public int bookId { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }
    public List<Book> Books { get; set; }
}

public class Book
    {
        public int BookId { get; set; }
        public string Name { get; set; }
        public string Notes { get; set; }
        public Shelf shelf { get; set; }
    }

public class ReadViewModel
    {
        public int ShelfId { get; set; }
        public string Name { get; set; }
        public List<Book> Books { get; set; }
    }

控制器似乎很好,因为我能够显示ReadViewModel的ShelfId和Name。 修改我可以根据用户的要求提供操作方法。

 [HttpGet]
    public ViewResult Details(int ShelfId)
    {
        //find the right building for edit
        var shelfs = from shelf in applicationDBContext.Shelfs
                                         where shelf.ShelfId == ShelfId
                                         select shelf;

        ReadViewModel readViewModel = new ReadViewModel
        {
            ShelfId = shelfs.First().ShelfId,
            Name = shelfs.First().Name,
            Books = shelfs.First().Books, //Error still present despite this
        };
        return View("Details", readViewModel);
    }

我知道,我应该使用异步并等待上面的内容,但我正在教自己mvc,vnext等等。所以使用上面的内容告诉我在使用更多“最佳实践”之前流程是如何工作的。

查看

 @model Application.Model.ReadViewModel
    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    @{
        ViewBag.Title = "Shelf Details";
    }


<h1>Building Details</h1>
<table>

        <tr>
            <td>@Html.LabelFor(model => model.ShelfId)</td>
            <td>@Html.DisplayTextFor(model=>model.ShelfId)</td>
        </tr>
        <tr>
            <td>@Html.LabelFor(model => model.Name)</td>
            <td>@Html.DisplayTextFor(model => model.Name)</td>
        </tr>
     </table>
<h2>Rooms</h2>
<table>
    <tr>
        <td>@Html.LabelFor(model => model.Books.First().BookId)</td>
        <td>@Html.LabelFor(model => model.Books.First().Name)</td>
    </tr>

    @*@foreach (var book in Model.Books)
    {

    }*@

    @*@for(var booksIndex = 0; booksIndex < Model.Books.Count(); booksIndex++)
    {
        <tr>
            <td>@Html.DisplayTextFor(model => model.Books[booksIndex].BookId)</td>
            <td>@Html.DisplayTextFor(model => model.Books[booksIndex].Name)</td>
            <td></td>
        </tr>
    }*@
</table>

问题

当我尝试使用for或foreach迭代房间时,我一直收到类似Value cannot be nullObject instance cannot be null之类的错误。 如果我注释掉循环,我可以显示货架ID和名称。

尝试

这对我没有意义。有一段时间我没有书架上的书籍数据,所以我认为这就是问题所在。所以我输入了一些数据,我仍然得到完全相同的错误。所以我确信我的观点无法遍历我的书并列出它们。

在我尝试通过浏览器访问视图之前,上面给出的两个循环都没有错误。

1 个答案:

答案 0 :(得分:1)

Yea控制器很重要,也很重要。你是如何选择模型的?你使用什么框架?怎么样,Linq2SQL,小巧玲珑?

您未设置null或对象的原因显然是因为未设置这些值。没有人试图欺骗你。

项目编译正常,因为代码语法在构建时是正确的。您在视图中出现错误的原因(称为运行时错误)是因为绑定的数据不正确或丢失。编译器无法验证运行时数据...因为它对此没有任何了解。

使用Visual Studio,您可以在@code部分的View中设置断点。我建议在第一个循环中设置一个断点。单击最左边的边距以获得红点。

enter image description here

在Debug(F5)中运行该站点,Visual Studio将在View上的断点处停止。然后,您可以检查ModelList<Model>,看看有哪些数据。确保填充所需的属性。 (图像显示运行调试后的断点。显示黄色线条,您可以将鼠标悬停在变量上以检查值或右键单击它们并将它们添加到监视面板中)

这是您在运行时遇到这些错误的唯一原因。