gpt4 book ai didi

asp.net-mvc - 将 DataAnnotation 属性从 Model 应用到 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:18:46 25 4
gpt4 key购买 nike

我们将所有的 DataAnnotations 放在 Model 类 Customer 上。然后,我们将 Customer 的一个实例作为我们关联的 ViewModel 上的属性公开,以及一些国家/地区的查找列表等,并将其显示在我们的 View 中。到目前为止一切都很好。

然后我们阅读 SO 和其他来源,我们不应该将整个 Customer 模型对象传递给 View,因为只为 View 提供它需要的最低限度,更重要的是(对我们来说)防止 ModelBinding 时可能出现的问题潜在的恶意回发,它们添加了额外的信息来更改我们的模型属性,否则这些属性在 View 中是不可用的。

我们如何将所有这些 DataAnnotation 属性从模型对象中取出并放到可能被削减的 ViewModel 属性上,而不会将 DRY 原则抛到悬崖边上?

另外,我们认为我们不应该对从数据库中提取的实体使用 TryUpdateModel 是否正确?我想我们的选择是使用 TryUpdateModel 并传递一个排除属性列表,考虑到该列表只是字符串类型的参数,这对我来说似乎不是特别优雅。或者也许我们应该取消 TryUpdateModel 并使用诸如 AutoMapper 这样更安全的工具?

感谢您对这些问题的任何想法。

最佳答案

How do we get all of those DataAnnotation attributes off the model object and onto the possibly cut down ViewModel properties without throwing the DRY principle over the cliff?



你不能。这是要付出的代价,但我认为它很便宜,因为实际上在这个精简版本中,验证属性可能会有所不同,并且您可能会根据 View 的要求具有不同的验证属性。举个例子: NewEdit看法。在 Edit看, Id将需要实体的,而在 New view 不需要,因为它将由数据存储分配(实际上在您的新模型中甚至可能没有 Id 属性)。

此外,通常我只将验证属性放在 View 模型上,但这可能不是最好的方法,因为如果您想在不同的应用程序中重用模型,它们上不会有任何验证逻辑。

Also, are we correct in thinking that we shouldn't be using TryUpdateModel against an entity that we pull from the db?



我个人从不使用 TryUpdateModel .我更喜欢将 View 模型作为 Controller 操作参数传递,并让默认模型绑定(bind)器完成这项工作。在这种情况下,您当然不需要任何包含或排除属性列表,因为此 View 模型完全适合给定 View 。

就 AutoMapper 而言,它是在模型类(出现在存储库方法签名中)和传入和传出 View 的 View 模型之间转换的必备工具。

关于asp.net-mvc - 将 DataAnnotation 属性从 Model 应用到 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4271757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com