I’ll explain my point:
The best practice is to create views strongly typed with a Model. You only can stronly type one Model.
If you need two models in a view you can created two views and use Partial Render, but it seems not to be the very best option.
Another approach is to create another type model that encapsulates the other pieces of the model what you need; this make much more sense for me.
Then, my question is, in a complex proyect when a page needs to communicate with all the models and they are not direct realted, developers create a type that encapsulates all the other things?
For non-related parts of your view, you may use Html.Action() to invoke an action that returns a partial view.
This way, the logic of the “area” will be encapsulated in its own action and/or controller.
Update: I don’t know if it’s really the best practice, but I prefer composition over complex views & view models. Even for related information, I prefer to break it to smaller partial views and child actions. As I see it, it has the following flexibility:
In (4) I mean that you can easily do the following without complicating your view model:
Answering the question in your comment.
Considering twitter. There’s the content pane and the users box on the left.
So here’s our TweetsController:
The Tweets/Index view may look like:
Note that the left pane just calls the Index action in UsersController to display the users list.
Here’s how it may look like:
And here’s the partial view (Users/Index):
So what will actually happen, when the Tweets view will be rendered Html.Action will put the partial view returned by UsersController.Index in the left pane.
Of course you may move this logic into a layout if this behavior is common for a number of pages.
Hope that helps.