0

我的视图模型看起来像这样:

public class CarViewModel {
    public CarModel Car { get; set; }
    public List<CarModel> Cars { get; set; }
}

CarModel好像:

public class Car() {
    public string Make { get; set; }
    public string Model { get; set; }
    . . .
}

我的目标是只有一个视图模型可以用于列表视图和单个视图。对于列表视图,我将合并 Cars 列表并在视图中使用它,同时忽略单个 Car 实体。

对于细节视图,情况正好相反。我的控制器将水合单个 Car 实体,视图将使用它并忽略列表。

这部分工作,但模型绑定很弱。

DRY(不要重复自己)和 SOC/SRP(关注点分离/单一责任主体)似乎在这里发生冲突。处理列表视图和详细信息视图的最佳方法是什么?我感觉答案是创建重复的视图模型,但如果我能提供帮助,我不想重复代码。

4

2 回答 2

2

看来你有点想多了。只需有一个名为 CarViewModel 的类,它看起来像这样:

public class CarViewModel() {
    public string Make { get; set; }
    public string Model { get; set; }
    . . .
}

对于您的 Detail/Edit/Create 视图,您的视图将是CarViewModel. 对于您的列表视图,只需将列表传递CarViewModel给视图。在列表视图上制作模型类型IEnumerable<CarViewModel>()。这会从您当前建议的前进路径中删除一个类,并保持一个视图模型负责与 Car 相关的所有事情。

编辑

问题是 - “如果我的列表视图模型需要更多信息而不仅仅是汽车列表”。在这种情况下,为列表视图创建一个独立的视图模型是有意义的,因为它需要额外的信息。

public class ListOfCarsViewModel(){
   public IEnumerable<CarViewModel> Cars {get;set;}
   public string SomeOtherProperty {get;set;}
   public bool SomeFlagProperty {get;set;}
}

请注意,我们不会重复自己,因为我们仍在将汽车列表传递给视图。然而,由于我们需要的不仅仅是汽车列表,因此这个视图模型需要拥有更多的属性而不仅仅是一个列表。如果您的代码/视图需要这些信息,那么拥有多个视图模型并没有错。

于 2012-10-28T16:47:34.443 回答
0

您也可以像这样继承您的基类,您的主要模型是

public class Car() { public string Make { get; set; } public string Model { get; set; } . . . } 和你的模型课

public class CarViewModel:Car { public List<CarModel> Cars { get; set; } }

于 2012-10-30T11:45:06.623 回答