MVC模式和灵活性?

时间:2013-10-03 07:20:43

标签: asp.net-mvc asp.net-mvc-4

我对MVC模式相当新,随着我使用这种逻辑进行更深入的开发,我面临着一些我可以克服的问题,但我不确定我是否采用了正确的方法(最好的)实践)。

所以问题:

我有View收到Model,其结构如下:

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。所以这意味着,据我所知,View首先完全呈现,然后解析内部代码并转换到最终的HTML输出(这是如何工作的?可以在这里使用一些说明还)

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

1 个答案:

答案 0 :(得分:1)

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

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

尝试更改此内容:

@if(Model.ListOne != null)

到此:

@if(Model.ListOne.Any())

目前您只检查Model.ListOne不是null - 即尚未通过ListOne=new List<MyItem>()或类似的东西在模型中的某个位置初始化 - 但是您真的需要检查Model.ListOne是否为空

我会说你应该尽量确保在编写视图时没有null模型属性,这使得混合{{1}变得非常混乱检查;更好地确保在将模型提供给视图之前,要在视图中访问的任何模型属性都是初始化的。