0

哪种 ViewModels 方法更好:
1. 只需ICollection<T>在 ViewModel 中有一个并在视图中访问它的属性,这几乎是我在 ASP.NET Forms 中所做的,如下所示:

public ICollection<Order> Orders {get; set;}

所以在视图中我会做这样的事情

@if(Model.Orders.Count > 0){


2. 为 ICollection 创建一个属性,Count以便视图可以直接引用该值。

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。视图是否应该保持纯粹并且没有逻辑/“编程”

4

1 回答 1

2

3.)不要Collection<T>在视图模型上使用 a ,这可能是矫枉过正。相反,使用 T[]。为什么?因为您不应该需要视图模型中的属性提供的.Add,.Remove和其他开销方法。最后,如果您只是将它用作 DTO 将数据从控制器传递到视图,那么数组就可以了。在往返于控制器的传输过程中,无需将任何内容添加到可枚举中或从可枚举中删除。数组通常比s 和其他实现更快、更精简。ICollectionIEnumerableListIEnumerable

public Order[] Orders { get; set; }

然后,不要使用.Count,使用.Length。拥有一个单独的财产通常也是过度的国际海事组织。为什么?因为这只是意味着您最终会在不必要的地方编写更多代码。OrdersCount当您可以使用时为什么要添加属性Orders.Length

@if (Model.Orders.Length > 0) {

如果您正在寻找更短的东西,您可以使用.Any()LINQ 扩展方法(请注意,using System.Linq;在 viewmodel 类中使用它时必须拥有,但在剃刀视图中使用它不需要额外的东西):

@if (Model.Orders.Any()) { // returns true if Model.Orders.Length > 0

此指南的一个可能例外是 ifOrders未设置,即它是null。在这种情况下,您上面的剃刀代码会抛出一个NullReferenceException. 为此,您可以在视图模型上创建一个HasOrders属性以针对null和进行测试.Length。然而,更简单的解决方案可能是在构造函数中初始化属性:

public class MyViewModel
{
    public MyViewModel()
    {
        Orders = new Order[0];
    }

    public Order[] Orders { get; set; }
}

当然,有了上面的人仍然可以将数组设置为null,因此您可以决定是否执行此操作,或者创建一个单独的属性来测试null,或者只是null在您的剃刀代码中进行测试。

using System.Linq;

public class MyViewModel
{
    public Order[] Orders { get; set; }
    public bool HasOrders { get { return Orders != null && Orders.Any(); } }
}

...或者...

@if (Model.Orders != null && Model.Orders.Any()) {

无论如何,您最终都会在消费类或消费类中获得更多代码。使用这些因素来决定哪种方法意味着更少的代码编写:

a.) 财产有可能null吗?

b.) 视图模型中有多少集合属性?

nullc.) 您必须针对其中一个或.Length在剃刀视图中测试多少次?

于 2013-03-22T22:45:00.647 回答