gpt4 book ai didi

asp.net-mvc-3 - CompareAttribute 并与复杂类型的属性进行比较

转载 作者:行者123 更新时间:2023-12-04 06:32:30 26 4
gpt4 key购买 nike

我刚刚阅读了 MVC3 的新 CompareAttribute,您可以将其应用于模型的属性以定义它应该匹配的另一个属性 - 经典用例是确认电子邮件地址已正确输入,或具有密码和 ConfirmPassword 字段。我在尝试在我自己的项目中实现它时遇到了问题。

我们有一个相当标准的 User 对象,除其他外,它具有以下属性:

public class User {
....
[Required, RegularExpression(RegularExpressions.Email, ErrorMessage = "Please supply a valid email address")]
public string EmailAddress

[Required]
public string Password
....
}

然后我将 User 和我们需要的其他几个对象合并到一个 View 模型中:
public class SignUpViewModel {
....
public User user { get; set; }
....
}

当传递到 UI 中的表单时,允许 ModelBinder 在用户提交表单时为 User 对象以及 SignUpViewModel 中的其他对象和原始类型运行数据注释验证。当这一切“正常工作”时,我真的很高兴,因为这意味着我们可以在一个地方定义验证,而无需做太多的工作来持久化到数据库或将 UI 模型映射到域模型等。

注意到 Html.EditorFor(model => model.User.Password) 发出名称设置为“User.Password”的信息,我在 SignUpViewModel 中添加了以下内容:
[Required, Compare("User.Password")]
public string ConfirmPassword { get; set; }

但是现在提交表单会触发“找不到名为 User.Password 的属性”的验证错误。我希望它会遵循同样的约定,但它似乎不是:(

我真的不想将 ConfirmPassword 放入 User 对象中,因为 ConfirmPassword 纯粹是一个 UI 问题,在这样的域对象中使用它似乎是错误的。我也真的不想将 SignUpViewModel 中的各种对象弄平,因为这开始感觉像是在定义验证规则的位置重复,并且我们正在努力使我们的代码尽可能保持干燥。

有没有人遇到过让 CompareAttribute 与同级对象的属性而不是同级属性进行比较的方法,就像属性所期望的那样?

最佳答案

摆脱User您的属性(property)SignUpViewModel并从 User 中放入必要的属性SignUpViewModel 上的域对象.

您说您希望将您的关注点分开,并且将域对象作为 View 模型上的属性是一个没有将您的关注点分开的示例。

这看起来可能会导致您编写更多代码,但请查看类似 的解决方案。 Automapper 自动映射域对象属性以查看模型属性。

关于asp.net-mvc-3 - CompareAttribute 并与复杂类型的属性进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235315/

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