我是web开发的新手,我很难区分模型类和数据类,尤其是在实现它们时。
我发现了这个问题,我有点理解了它的理论:数据类包含了关于对象的所有核心信息,而模型类只包含了需要公开的信息。所以我可以有一个这样的用户数据类:
public class User {
public long Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public int Score { get; set; }
}
登录页面的模型类如下:
public class UserModel {
[Required]
public string Password { get; set; }
[Required]
[EmailAdress]
public string Email { get; set; }
}
我必须为注册创建另一个模型类,例如,添加Name
属性。但是,我是否需要为每个新模型重复相同的属性?模型是否需要从User
数据类继承?所有这些都是MVC模式特有的吗?模型类和数据类在实际实现中是如何相互关联的?
如果有帮助的话,我会使用Blazor WebAssembly。
我注意到,在ASP.NET Core、ASP.NET MVC(较旧,已被ASP.NET Core取代(、Razor和Blazor的上下文中;型号";是";视图模型";。不要将其与";实体模型类";,我相信你指的是";数据类";。
但是我需要为每个新模型重复相同的属性吗?
是(例外,例如当您组成视图模型时(
模型需要从User数据类继承吗?
不,不要那样做。
虽然两个或多个不同类型(类(可以共享相同的成员,但这并不意味着它们表示相同的"类";事物。在OOP中,继承应该只用于表示";是";关系,而不是";具有";关系,尤其不是"关系">I’m to lazy to have to declare-all of my-members-again-argh"(尽管我对最后一件事感到非常内疚…(。
不幸的是,C#(还(不支持mixins,这是一个术语,用于描述面向对象语言具有多个具有相同成员的不同类型的能力,而不表达这些类型之间的任何实际关系。
(除了.NET Core 3.0上的C#8.0支持具有默认接口实现的_quai-_mixins,但与真正的mixin相比,它有一些局限性,例如,我知道你不能使用这种方法导入运算符重载、转换运算符或构造函数,我认为关于virtual
成员也有一些局限,我认为它根本不适用于structs
(至少在没有拳击的情况下,这对表演不利((。
所有这些都是MVC模式特有的吗?
MVC设计在每个web框架中都很常见,实际上不仅仅是ASP.NET Core或ASP.NET MVC,还有Python、PHP、Ruby等的MVC框架。
模型类和数据类在实际实现中如何相互关联?
- 给定项目中的域实体(在本例中,为"用户"(:
- Entity("data"(类将对象表示为业务对象,以及它在数据库中的存储方式
- 每个视图模型("模型"(类代表业务域的特定视图(可以是只读或读写的(,通常是业务域对象图子集的快照,还包含页面本身的其他属性(如页面
<title>
、当前登录用户的详细信息等(。- 请注意,一个域实体类可以有多个视图模型类来表示它(请参见下文(。类似地,视图模型可以表示多个域实体对象(或者根本不表示(
例如:
- 给定一个
class User
(实体类(:- A";用户列表";页面将具有
class UserListPageViewModel
和IReadOnlyList<User>
属性 - 一个";编辑用户";页面将有一个
class EditUserPageViewModel
,其中包含每个可编辑用户属性/列/属性的属性。- 但它不能为模型绑定公开
User
类,因为这样攻击者就可以发送一个伪POST
表单请求,指示模型绑定器覆盖Password
字段
- 但它不能为模型绑定公开
- A";欢迎页面";视图模型还可以包含CCD_ 13属性,该属性包含加载的CCD_;布局";
.cshtml
文件(也称为Aspx中的.master
"主页",或任何类型的通用HTML模板等(将用于填充"主页";欢迎John Doe"区域等
- A";用户列表";页面将具有