ViewModels的哪种方法更好:
1.只需在ViewModel中有一个ICollection<T>
并在视图中访问它的属性,这就像我在ASP.NET Forms中所做的那样,如下所示:
public ICollection<Order> Orders {get; set;}
所以在视图中我会做这样的事情
@if(Model.Orders.Count > 0){
或
2.为ICollection的Count
创建一个属性,以便View可以直接引用该值。
public ICollection<Order> Orders { get; set; }
public int OrderCount { get { return Orders.Count ; } }
然后在视图中
@if(Model.OrderCount > 0) {
或者可能是一个布尔属性HasOrders
来进一步减少视图中的逻辑?
修改
我对这些评论感到有些惊讶,我接受这是主观的,但是关于是否使用字符串属性来约会并且每个人都必须开始在某个地方学习的问题也是如此。
我会对OrderCount
属性有多种用途吗? if
然后是一个标签来显示实际的数量。因此,它会比使用客户电子邮件地址更频繁地使用,但如果有人建议
public string Email { get; set; }
把事情搞得太过分了。
尝试重新调整问题的重点;我想要确定的是ViewModel应该为视图需要的所有内容提供简单的属性 - 因此无需深入到Model.Orders
来访问Count。 View应该保持纯粹,不受逻辑/“编程”的影响
答案 0 :(得分:2)
3.。)不要在视图模型上使用Collection<T>
,它可能有点过分。相反,使用T []。为什么?因为您不需要.Add
,.Remove
以及ICollection
为视图模型中的IEnumerable
属性提供的其他开销方法。最后,如果您只是将它用作DTO来将数据从控制器传递到视图,那么数组就非常好了。在传输到控制器和从控制器传输期间,不必向可枚举中添加任何内容或从中删除任何内容。数组通常比List
和其他IEnumerable
实现更快,更精简。
public Order[] Orders { get; set; }
然后,请勿使用.Count
,请使用.Length
。拥有一个单独的财产通常也是矫枉过正的IMO。为什么?因为它只意味着您最终在不必要的地方编写更多代码。为什么在使用OrdersCount
时添加Orders.Length
属性?
@if (Model.Orders.Length > 0) {
如果你正在寻找一些更短的东西,你可以使用.Any()
LINQ扩展方法(注意在viewmodel类中使用它时你必须有using System.Linq;
,但是没有什么额外的需要在剃须刀视图中使用它):
@if (Model.Orders.Any()) { // returns true if Model.Orders.Length > 0
如果未设置Orders
,则可能是本指南的一个例外情况,即null
。在这种情况下,上面的剃刀代码会抛出NullReferenceException
。为此,您可以在viewmodel上创建HasOrders
属性,以针对null
和.Length
进行测试。但是,更简单的解决方案可能是在构造函数中初始化属性:
public class MyViewModel
{
public MyViewModel()
{
Orders = new Order[0];
}
public Order[] Orders { get; set; }
}
当然,有了上述人员仍然可以将数组设置为null
,因此您决定是否执行此操作,还是创建一个单独的属性来对null
进行测试,或者只是对{进行测试你的剃刀代码中的{1}}。
null
...或...
using System.Linq;
public class MyViewModel
{
public Order[] Orders { get; set; }
public bool HasOrders { get { return Orders != null && Orders.Any(); } }
}
无论如何,您最终会在消费类或消费类中使用更多代码。使用这些因素来确定哪种方法意味着编写更少的代码:
a。)该属性可能是@if (Model.Orders != null && Model.Orders.Any()) {
吗?
b。)viewmodel中有多少个集合属性?
c。)您需要在剃须刀视图中对null
或null
进行多少次测试?