我是应该将对象或ViewModel用于MVC还是两者都使用?

时间:2018-03-22 14:40:04

标签: c# asp.net-mvc

我正在学习MVC。我有一个我使用webforms开发的应用程序,我正在移植,但我遇到了一些 snag

我也在使用实体框架。

目前,我的模型代表数据库表。通常,我的控制器将从表中获取数据并创建将传递给视图的视图模型。

我有点困惑的是,当我需要根据模型数据进行一些转换并将其传递给视图时,我不确定转换发生的位置。

在webforms应用程序中,我将有一个类,我将从中创建新对象,然后所有转换都会在那里发生。一个很好的例子是User;数据库将存储名字和姓氏,该对象将具有FullName的公共属性,该属性将在构造函数中设置。

我已经阅读了关于Thin Controllers / Fat Models的一些相互矛盾的讨论,反之亦然。我有点困惑。根据Microsoft文档,瘦控制器和胖模型似乎是推荐的方式,但它们并没有给出真实世界的例子。

以一个例子:

public class UserEntity
{
    public int ID { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
}

public class UserController : Controller {
{
    protected readonly DBContext _context;
    public UserController(DBContext context)
    {
        _context = context;
    }

    public IactionResult Index(int id)
    {
        var _user = _context.Users.Single(u => u.id == id);

        UserViewModel _viewModel = new UserViewModel
        {
            FirstName = _user.FName,
            LastName = _user.LName,
            FullName = ""
        };

        return View(_viewModel)

    }

}

如果上述情况不完美,请原谅我 - 我刚刚写了一个简单的例子。它并不是完美无瑕的代码。

对于Fullname,我会在哪里提供可以提供该信息的逻辑。现在,我意识到在这个非常简单的示例中,我可以很容易地在那里得到全名。但是,让我们假设它比连接两个字符串要复杂得多。我会在哪里放置GetFullName方法?

我的模型中有方法吗?我会创建一个User类并传递返回的模型数据吗?如何拥有一个单独的类库?如果是后者中的任何一个,我会将User个对象传递给我的视图模型,还是会从创建的User对象中设置视图模型属性?

1 个答案:

答案 0 :(得分:1)

实体框架通常将业务的表示与关系数据实现相关联。这种方法非常适合商业模型的清晰表示。但是在一个网页中,直接表示通常不会在应用程序结构中转换或播放。

他们最终通常会实现一种称为模型 - 视图 - 视图 - 模型(MVVM)的模式。基本上,将单个或多个实体转换为单个对象,将其作为模型放置在视图中。这种转变解决了大量问题,例如。

public class UserModel
{
     private readonly UserEntity user;

     public UserModel(UserEntity user) => this.user = user;

     public string Name => $"{user.First} {user.Last}";
}

实体和数据库反映了用户名分隔,第一个和最后一个。但是将实体放置到另一个结构中,允许您构建一个代表模型以遵守视图。显然是一个简单的例子,但是这种方法通常用于更透明的表示,因为视图和数据库可能不会完全相互直接重合。

所以现在你的控制器会沿着这些方向做点什么。

public class UserController : Controller
{
     public IActionResult Index(int id) => View(new UserModel(new UserService().GetUserInformation(id)));
}

我完成了回答,我试图用一个例子来表达评论表达得非常好。

  

ViewModels就是这个名字所暗示的。特定视图的模型。他们   不是域实体或DTO。如果方法对视图有意义   模型,把它放在ViewModel中的好地方。验证,   通知,计算属性等都是很好的候选人。一个   另一方面,抵押贷款计算器将是一个糟糕的候选人 -   这是一个商业功能 - Panagiotis Kanavos 7分钟前