我正在学习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
对象中设置视图模型属性?
答案 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分钟前