What is the appropriate granularity in building a ViewModel?

☆樱花仙子☆ 提交于 2019-12-08 03:04:19

问题


I am working on a new project, and, after seeing some of the difficulties of previous projects that didn't provide enough separation of view from their models (specifically using MVC - the models and views began to bleed into each other a bit), I wanted to use MVVM.

I understand the basic concept, and I'm excited to start using it. However, one thing that escapes me a bit - what data should be contained in the ViewModel?

For example, if I am creating a ViewModel that will encompass two pieces of data so they can be edited in a form, do I capture it like this:

public PersonAddressViewModel {
    public Person Person { get; set; }
    public Address Address { get; set; }
}

or like this:

public PersonAddressViewModel {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string StreetName { get; set; }
    // ...etc
}

To me, the first feels more correct for what we're attempting to do. If we were doing more fine grain forms (maybe all we were capturing was FirstName, LastName, and StreetAddress) then it might make more sense to go down to that level. But, I feel like the first is correct since we're capturing ALL Person data in the form and ALL Address data. It seems like it doesn't make sense (and a lot of extra work) to split things apart like that.

Appreciate any insight.


回答1:


If you are using all the fields of the Person object, then there's nothing wrong with using a complex view model. However, if you are only using a field here or there, then it's much better to build your viewmodel with only those values you are using.

You can do your view models any way you like, but the whole point of having them is that a view model should be customized to the view it's representing.

It can also be a lot easier to use the first method if you're using something like AutoMapper to map to business or domain models, because the objects should have similar definitions.




回答2:


You're not using MVVM. You're defining ViewModels, classes for only view purposes in order to avoid to break the Model classes. In that case you can define the properties you want for your best profit. In the example I will go for the second solution but it's up to you.

I'm working on a big project with many developer providers. In that case the customer let us to define the ViewModels that we want keeping the Models (Business Entities as they call) for their concern. Because we are different groups no one is worried about another ViewModels so you can even use one class for one view, no matter if another view is different a little bit from the first one. That's one of the advantages of ViewModels instead of pure Model using.

I prefer to define the ViewModels in client-side through JSON objects for the sake of data binding. With this you can truly use MVVM through knockoutjs, angularjs, backbonejs, etc....

If you want to use MVVM check knockoutjs. It's very easy and pleasant to use




回答3:


Using Model classes directly or wrapping them (as in your 1st example) in your ViewModel class can be a potential security issue if your Model classes have some sensitive properties (i.e. IsAdmin in the User class).

Say your controller actions takes a PersonAddressViewModel input parameter:

public ViewResult someAction(PersonAddressViewModel personAddress)
{
  //save it
}

A malicious user can basically set any property in your PersonAddressViewModel composite object even if your UI does not provide such capabilitiy. This is made possible by the default binding mechanism of the MVC. To avoid this, either don't wrap sensitive model classes or use the Bind attribute

More on this here: Pro ASP.NET MVC 3 Framework 3rd Edition By Steven Sanderson , Adam Freeman (Chapter 17)




回答4:


If you're using that view model to render a form, I would vote for the second approach, since you're combining all the view data required for the form.



来源:https://stackoverflow.com/questions/12878527/what-is-the-appropriate-granularity-in-building-a-viewmodel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!