MMO ...
MVC is a very general design pattern that does not necessarily say what is good and what is bad. There is a model, view and controller. The responsibilities of each of these things depend on the taste of MVC, and the taste of MVC that you choose should depend on the complexity of your project. For example, if you have a domain-driven project, then the examples given by others here will not work very well.
So, in the database itself:
Model: an object that has data that will be displayed in the view. Whether this is a DTO or a domain model is not really defined here, but I will share my thoughts about it in a second.
View: this is what the user sees and how the user interacts. Any code or logic here should directly support the view. In other words, the ZERO business logic, the ZERO data access logic, ZERO knows anything other than what the user physically sees. Either a web form, a desktop window form, or activity (mobile), etc.
Controller: Probably the most ambiguous piece of this puzzle. One thing is certain, it acts as an intermediary between the representation and the “model”, and also decides what happens next or, rather, “controls” the flow. But it’s important not to get too detailed with this description. That this thing really depends on your understanding of MVC. Therefore, I will describe how I look at it in a web context; but basically, just draw a line between flow control of the service and the actual execution of the service.
MVC, for me, is not another way to describe the N-level, as some people may require. There are no layers in MVC, since MVC is actually in your view layer . Each MVC element actually lives in the presentation layer, and the MVC pattern simply says that you should separate the problems between getting the data and displaying it:
- Model: what the data looks like. It’s actually just a structure that a view will use to retrieve its data.
- View: Actually displaying it
- Controller: determining where to get data for the model or even the model itself.
If you can accept this statement, then this should help clarify that the model is valid in this context. The model is NOT a data access object, and the model is NOT a domain model, because none of these things should be in your view layer. So this leaves us with either a ViewModel (MVVM) or a DTO. I'm going to go with the DTO for the sake of simplicity.
So, if we adopted the DTO as the type of model we are talking about when we say “model” in MVC, then where do we get it? If the controller should not bother with data access, then where? How about your level of service? Your service layer contains everything “how” to your application. This is the "Do stuff" layer. Therefore, if your view wants to create a user, it will collect data and pass it to the controller. The controller decides which services to call to complete the task and sends a request with the necessary data. The level of service meets the DTO. This DTO can either be used directly or added to another model (if, for example, there were several services called).
Important points:
- The controller does not know anything about your domain (if you have one), it only knows about your available services and how to call them.
- Absolutely no business logic is executed by the controller. For example, if you need to send a greeting letter as part of a CreateUser operation that will not be initiated by the controller, as this is technically a business rule. It will be processed between your service and domains.
- In my opinion, your controller should not perform any data access. This should be delegated to the service level. Many tutorials, as a rule, show that the controller interacts with repositories, which, I think, are beautiful, because the abstraction, but the direct access to the data should be absolute, nowhere at the presentation level.
Again, this is in a web context. If you work with MVC in an Android app, you may not have a service level or domain. Perhaps you will interact with another breed of objects. Personally, I always use service levels or applications and for several reasons that may or may not be considered valuable to others.
So, in MVC.Net, the controller is more like an API; Presentation and API are two different presentation media designed for collaboration (the internal controller represents the data, the external controller builds models with this data and acts as an intermediary with the presentation). In Angular, the controller is more like what we are talking about here. It seems layers are layers of layers. This confuses conceptualization a bit, but the concept never goes beyond the level of presentation.
But to summarize: The controller “controls” the operations and data coming in and out of your system, into and out of the view, but actually does not do business . The details of this process depend heavily on your design philosophy for the project.

So here, in this diagram, I have grouped concepts to show MVC at the N-level in a typical monolithic application. The connection is performed from left to right and does not skip to any other layer (see: "Onion architecture"). At the presentation level, the controller knows about the model and presentation, but the presentation and model know nothing for the most part. However, in many versions of MVC, including ASP.Net and MVVM, the view may know about the model interface or prototype (but not the model instance) so that it can bind to it.
The controller will handle manipulations with the model (or view model in this context), which means that it may need to know about domain objects and domain services. You can optionally add an application layer between the presentation layer and the domain if you want to use a reusable application (for example, your application can have several chapters: web API and desktop application and mobile application, etc.) to provide a transactional boundary and further isolation. It is important that the view does not have any knowledge / dependencies on domain objects in this architecture - why there is a separate model for the view. The point of the model in MVC is to create a model for presentation. That is, it is a model specifically designed to serve a view, not a domain. This is normal for a view model for transferring / adapting a domain model if it has never been published and / or accidentally serialized.
On the other hand, the "presentation level" in the web API, in my opinion, is a serialized contract (for example, JSON or XML). Therefore, treat this accordingly.