我对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“混合”时,这将更容易实现。不要误解我的意思,我很清楚使用设计模式给开发人员带来的好处,但是对于这个特殊的问题,它真的让我想知道它实际上是多么灵活。
答案 0 :(得分:1)
Razor 从模型的角度来一次性渲染它,你可以自由地将代码与HTML混合 - 这就是让它如此棒极了!
这里的问题似乎是您尝试访问列表的方式。
尝试更改此内容:
@if(Model.ListOne != null)
到此:
@if(Model.ListOne.Any())
目前您只检查Model.ListOne不是null
- 即尚未通过ListOne=new List<MyItem>()
或类似的东西在模型中的某个位置初始化 - 但是您真的需要检查Model.ListOne
是否为空。
我会说你应该尽量确保在编写视图时没有null
模型属性,这使得混合{{1}变得非常混乱检查;更好地确保在将模型提供给视图之前,要在视图中访问的任何模型属性都是初始化的。