模型在MVC中的作用是什么?

the*_*tus 5 model-view-controller asp.net-mvc model

我读过一些关于MVC的文章,但有一件事我不清楚.该模型在实际中的作用是什么.

模型是否代表业务对象?或者它只是一个帮助从控制器向视图发送信息的类?

以两个业务类为例(从数据库填充的数据)

Class Image
    Property FileName As String
    Property CreatedBy As User
End Class

Class User
    Property UserName as String
End Class
Run Code Online (Sandbox Code Playgroud)

将"Image"作为模型还是应该创建一个新类?

在模型中,我应该创建一个UserName属性来从User对象中获取它的数据吗?

Class ImageModel
    Property FileName As String
    Property CreatedBy As User

    ReadOnly Property UserName As String
        Get
            Return User.UserName
        End Get
    End Property
End Class
Run Code Online (Sandbox Code Playgroud)

Sco*_*pey 10

对此有很多看法,但根据我的经验,有两个主要观点Model:

视图模型

这是一个POCO,它只包含显示所需的所有数据View.数据通常由填充Controller.

胖模型,瘦瘦的控制器

Model完成大部分的业务工作.它包含并填充了所需的所有数据View,并用于Controller保存数据等.

MVC之美

MVC的美妙之处在于它是开放的!你可以选择你想要的任何类型的模型......你可以把所有的数据到ViewState,成Model,成一个ViewModel包含了一堆ModelS,不管.这完全取决于你.模型,视图和控制器是空白的画布,可以随意使用.

我用的是什么

我的团队已经做了很多MVC工作,我们已经尝试了很多这些不同的方法.我们最终决定我们最喜欢的是Fat Model,Skinny Controller范例.
我相信这种模式是"保持简单"和"不重复自己"的最佳模式,它绝对保持了"关注点分离".
以下是我们的代码组织方式:

  • 控制器
    • 处理与HTTP请求相关的所有内容 - 重定向,身份验证,Web安全,编码等.
    • 给a提供所有"输入" Model,并给出Model视图.不访问业务层或数据层.
  • 查看
    • 处理所有HTML和JSON生成
    • 仅访问强类型的数据 Model
  • 楷模
    • 负责进行所有更新,调用业务和数据层,加载所有数据
    • 处理所有验证和错误,并将这些返回给Controller
    • 包含所需的所有数据的属性View,并填充自身

虽然这听起来像是MVC的通用原则,但很快就会发现MVC不需要这些原则,这就是许多项目使用其他原则的原因.

这是一个例子Model.Controller创建它,它自己填充,Controller将它传递给View.

public class UsersModel
{
    protected UserBusiness userBusiness = new UserBusiness();

    public UsersModel(string editUserName)
    {
        // Load all users:
        this.Users = userBusiness.GetAllUsers();

        // Load the user to be edited:
        this.EditUser = (editUserName == null) ? null : userBusiness.GetUser(editUserName);
    }

    public List<User> Users { get; private set;}
    public User EditUser { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有"用户业务逻辑"都在一个不同的项目(我们的"业务层"),因为我们有一个大型系统.但是较小的项目不需要这样......模型可以包含业务逻辑,甚至是数据访问代码.