0

我对 MVC 模式还很陌生,随着我使用这种逻辑进行更深入的开发,我遇到了一些我可以克服的问题,但我不确定我是否以正确的方式进行操作(最佳实践)。

所以问题:

我有一个View接收Model具有以下结构的 a:

public class MyViewModel
{
    public string Title { get; set; }
    public string Subtitle { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }

    public List<MyItem> ListOne { get; set; }
    public List<MyItem> ListTwo { get; set; }
    public List<MyItem> ListThree { get; set; }
    public List<MyItem> ListFour { get; set; }
    public List<MyItem> ListFive { get; set; }
}

我希望仅当列表中有记录时才View显示每个项目的第一项。List所以我现在想做的View是这样的:

<div>
    @if(Model.ListOne != null)
    { 
        <img src="@Html.DisplayFor(model => Model.ListOne.First().Filename)" style="max-height: 800px;max-width:800px; padding-bottom: 5px;" />
    }
</div>

但是当我运行代码时,我收到一条错误消息System.InvalidOperationException: Sequence contains no elements。所以这意味着,据我了解,首先完全渲染视图,然后解析其中的代码并转换为最终的 HTML 输出(这是它的工作原理吗?也可以在这里使用一些澄清)

那么,实现这一目标的最佳方法是什么?使用 MVC 时是否会失去灵活性?现在,感觉就是这样。当您将代码与 HTML“混合”时,这将更容易实现。不要误解我的意思,我很清楚使用设计模式给开发人员带来的好处,但是对于这个特殊的问题,它真的让我想知道它到底有多灵活。

4

1 回答 1

1

从模型的角度来看,Razor一次性渲染它,你可以自由地将代码与 HTML 混合——这就是它如此棒的原因!

这里的问题似乎是您尝试访问列表的方式。

尝试改变这个:

@if(Model.ListOne != null)

对此:

@if(Model.ListOne.Any())

目前,您只检查 Model.ListOne 不是null- 即在您的模型中的某个时刻没有通过ListOne=new List<MyItem>()或类似的东西初始化 - 但您真正需要检查的是是否Model.ListOne

我想说的是,您应该在编写视图时尽可能确保没有null模型属性,这使得必须混合null检查变得非常混乱;最好确保在将模型提供给视图之前初始化要在视图中访问的任何模型属性。

于 2013-10-03T07:33:46.597 回答