使用单一视图模型进行详细信息,编辑和列表

时间:2012-10-28 16:32:39

标签: asp.net-mvc model-view-controller model-binding

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

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(关注点/单一责任主体)似乎在这里相互矛盾。处理列表视图和详细信息视图的最佳方法是什么?我觉得答案是创建重复的视图模型,但如果我能帮助它,我不想重复代码。

2 个答案:

答案 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; } }