我的视图模型看起来像这样:
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; }
. . .
}
我的目标是只有一个视图模型,我可以用于列表视图和单个视图。对于列表视图,我将水合汽车列表并在视图中使用它,同时忽略单个Car实体。
对于详细信息视图,情况恰恰相反。我的控制器将水合单个Car实体,视图将使用它并忽略List。
这部分有效,但模型绑定很弱。
干(不要重复自己)和SOC / SRP(关注点/单一责任主体)似乎在这里相互矛盾。处理列表视图和详细信息视图的最佳方法是什么?我觉得答案是创建重复的视图模型,但如果我能帮助它,我不想重复代码。答案 0 :(得分:2)
看来你有点过分思考。只需要一个名为CarViewModel的类,它看起来像这样:
public class CarViewModel() {
public string Make { get; set; }
public string Model { get; set; }
. . .
}
对于您的详细信息/编辑/创建视图,您的视图将为CarViewModel
类型。对于列表视图,只需将CarViewModel
列表传递给视图即可。在列表视图IEnumerable<CarViewModel>()
上创建模型类型。这将从当前建议的路径中删除一个类,并保持一个View Model负责与Car相关的所有事情。
修改强>
关注点是 - “如果我的列表视图模型需要的信息不仅仅是汽车列表,那该怎么办”。在这种情况下,为列表视图创建独立视图模型是有意义的,因为它需要其他信息。
public class ListOfCarsViewModel(){
public IEnumerable<CarViewModel> Cars {get;set;}
public string SomeOtherProperty {get;set;}
public bool SomeFlagProperty {get;set;}
}
请注意,我们不会重复自己,因为我们仍然会将汽车列表传递给视图。但是,由于我们需要的不仅仅是汽车列表,因此该视图模型需要具有的更多属性而不仅仅是列表。如果您的代码/视图需要该信息,则拥有多个视图模型没有任何问题。
答案 1 :(得分:0)
您也可以像这样继承您的基类 你的主要模特是
public class Car() {
public string Make { get; set; }
public string Model { get; set; }
. . .
}
并为您的模型类
public class CarViewModel:Car {
public List<CarModel> Cars { get; set; }
}