【发布时间】:2022-01-25 06:43:22
【问题描述】:
我刚刚搬到 Razor Pages 并碰壁了。这是一个页面模型:
public class ThisPersonPageModel : PageModel
{
[BindProperty]
public MyApp.Models.Person ThisPerson { get; set; }
… OnGet() …
… OnPost() …
}
实体是一个带注释的 EF Core 模型类(“域模型”),内置了所有约束和验证。但是这个实体上的这个特定视图只显示了一些模型属性,并且绑定器想要绑定所有他们。因此,在保存数据时,字段值会被删除。我期待能够使用 [BindProperty(Include="Field1,Field2")] 进行注释(类似于 MVC 的'Bind(Include="Field1,Field2")]')。但是 Razor Pages 显然不存在这种“字段选择”功能。可以? (或者有人知道它是否/何时到来?)
对我来说,这是一个严重的限制,甚至是使用 Razor Pages 的障碍。我想获得双向模型绑定的美丽 DRY 好处,主要是客户端验证(来自模型注释),并且在检索值时无需编写(重复)绑定代码。然而,我一直拥有具有广泛功能(许多属性)的域模型(数据库表),但是对于每个视图,根据他们的情况、需求和权限,仅向某些用户(角色)显示某些属性。 (我认为这就是视图的本质:针对特定用户和情况的数据的特定窗口。)例如,一个人可以更新他们的某些帐户属性(例如名称),但只有管理员可以更新其他属性(例如访问级别)。或者,同一个人在复杂实体的整个生命周期中处理其不同部分:早期填充早期属性,稍后填充属性。 (想一想向导 UI。)您不希望在保存后期属性时删除早期属性。对我来说,这种场景无处不在,多年来一直存在于许多数据库中,无论是由我还是其他人设计的。
我已经研究了几个选项,但没有任何结果。我在很多地方都看到过这个答案:“只需创建一个 PersonViewModel,其中只包含该视图所需的属性”。但是当然这不是 DRY(完美的领域模型已经存在),它需要映射到领域模型/从领域模型映射,那么领域模型上所有漂亮、复杂的约束和验证呢?是否也必须在本地页面模型上重新创建它们?这对我来说几乎结束了。我见过使用 AutoMapper,但我不确定它是否会映射到/来自具有较少属性的模型,以及在从域模型映射到页面模型时它是否保留约束和验证。这只是增加了 WET 的复杂性,'[BindProperty(Include="Field1,Field2")]' 可以很容易地解决。对我来说,这似乎是 Razor Pages 中双向模型绑定器的严重限制。我错过了什么?实现这一目标的最佳方法是什么?欢迎您提出替代方案和/或更正我的误解。
【问题讨论】:
标签: c# razor razor-pages model-binding two-way-binding